Ruby留下了僵尸以及如何管理命令执行

时间:2016-07-29 22:21:15

标签: ruby linux multithreading command

我需要在我的ruby应用程序中偶尔调用命令,大多数命令会很快结束,但有些会运行更长时间(比如播放一首歌),如果需要,我需要能够杀死该进程。 这些命令在子线程中被调用,以便不锁定应用程序的其余部分。

我还需要存储运行命令的信息(所以我知道如果需要可以杀死什么),但我还需要在命令结束时发送信息。

问题: waitwaitpid无效(他们永远不会回来) 我尝试使用trap,它检测命令何时结束,但它仅适用于最新启动的命令。 Ruby将命令保留为僵尸进程(直到杀死应用程序)并尝试使用killProcess.kill和直接调用命令)并不删除它们。 (也许是wait无效的原因??)

# Play sound (player can be either 'mplayer' or 'aplay' )
pid = spawn player, sound_dir + file

Eddie::common[:commands][:sound_pids][pid] = file

Signal.trap("CLD") {
  # This runs, but doesn't clean up zombies
  Process.kill "KILL", pid
  p = system 'kill ' + pid.to_s

  Eddie::common[:commands][:sound_pids].delete pid
}

如果我运行两次(在第一个命令运行时运行一次),在两个命令结束后它将如下所示:

Eddie::common[:commands][:sound_pids] => {3018=>"firstfile.wav"}

这是ps

的结果
chris     3018  0.0  0.0      0     0 pts/5    Z+   23:50   0:00 [aplay] <defunct>
chris     3486  0.2  0.0      0     0 pts/5    Z+   23:51   0:00 [aplay] <defunct>

添加了备注:使用system来调用该命令并不会留下僵尸进程,但反过来它不会被杀死..

0 个答案:

没有答案