如何检测并杀死楔入的 soffice.bin 进程?

Posted

技术标签:

【中文标题】如何检测并杀死楔入的 soffice.bin 进程?【英文标题】:How to detect and kill a wedged soffice.bin process? 【发布时间】:2012-12-06 21:17:32 【问题描述】:

我使用 libreoffice/openoffice 作为无头进程来处理我通过 unoconv “提交”的服务器上的一些文档转换任务。有时,实际完成工作的进程 soffice.bin 似乎被卡住了。我尝试使用 strace 并看到在启动新的 unoconv 实例时,它们仍然连接并与 soffice 进程对话,只是在“坏”文档进入后没有其他任何事情发生。如果它只是检测到那个 soffice不再与传入的套接字对话,编写看门狗很容易。但这显然不是那么简单。任何想法如何判断事情何时发生?

【问题讨论】:

【参考方案1】:

这是我设置为 cron 作业的内容:

def monitor_unoconv
  retval = false
  target_dir = "/tmp/monitor_unoconv"
  begin
    Timeout::timeout(30) do
      FileUtils.mkdir_p(target_dir)
      FileUtils.cp(File.dirname(__FILE__) + "/../hello.odt", target_dir)
      Dir.chdir target_dir do
        retval = system("unoconv -f html hello.odt")
      end
    end
  rescue => e
    STDERR.puts "Caught error #e.inspect"
    retval = false
  end
  if !retval
    STDERR.puts "soffice process appears hung.  Killing it"
    STDERR.puts `killall soffice.bin`
    sleep 5
    STDERR.puts `killall -9 soffice.bin`
  end
end

似乎工作正常。

【讨论】:

【参考方案2】:

问题可能与 soffice 多线程有关, 所以解决技巧可能是这样的:

    将 unoconv 用作服务。 创建一个 init.d 脚本并作为一个守护进程启动。 因此,unoconv 不会调用 soffice 来启动,而是将 unoconv 作为服务继续运行并维护它。 创建启动进程文件如下:

!/bin/sh

案例“$1”

    开始)

        /usr/bin/unoconv --listener &

        ;;

    停止)

        killall soffice.bin

        ;;

    重启)

        killall soffice.bin

        睡眠 1

        /usr/bin/unoconv --listener &

        ;;

esac

【讨论】:

以上是关于如何检测并杀死楔入的 soffice.bin 进程?的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver检测死锁;杀死锁和进程;查看锁信息

如何找到 MySQL 进程列表并杀死这些进程?

【zombie】如何查看并杀死僵尸进程?

如何杀死并重新运行qt中的主进程?

如何区分具有相同名称的多个进程并杀死所有在 C# 中以我的 USERNAME 运行的进程?

linux如何查看端口被哪个进程占用,并杀死相关进程?