我需要在我的ruby应用程序中偶尔调用命令,大多数命令会很快结束,但有些会运行更长时间(比如播放一首歌),如果需要,我需要能够杀死该进程。 这些命令在子线程中被调用,以便不锁定应用程序的其余部分。
我还需要存储运行命令的信息(所以我知道如果需要可以杀死什么),但我还需要在命令结束时发送信息。
问题:
wait
或waitpid
无效(他们永远不会回来)
我尝试使用trap
,它检测命令何时结束,但它仅适用于最新启动的命令。
Ruby将命令保留为僵尸进程(直到杀死应用程序)并尝试使用kill
(Process.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
来调用该命令并不会留下僵尸进程,但反过来它不会被杀死..