如何运行系统命令,并将PID管道传递到pidfile?

时间:2013-04-20 02:00:11

标签: ruby unix

如何运行命令并将生成的pid传递到pid文件中?

我正在寻找一个UNIX命令,但是如果有办法在Ruby中实现它,那也很好。

我试过了:

bundle exec clockwork clock_local.rb echo $! > #{current_path}/tmp/pids/clockwork.pid

它似乎将整个输出传递给pid文件而不仅仅是pid。

2 个答案:

答案 0 :(得分:7)

您可以使用Ruby的BEGIN {...}END {...}来帮助自动创建和删除PID文件。将这些添加到Ruby脚本:

BEGIN { File.write("#{ $0 }.pid", $$) }
END { File.delete("#{ $0 }.pid") }

您可以测试他们使用简单的脚本创建一个简单的PID文件,如:

BEGIN { File.write("#{ $0 }.pid", $$) }
END { File.delete("#{ $0 }.pid") }
sleep 60

运行它,然后,当它正在运行时,检查它所在的目录是否为pid文件。一分钟后,当sleep到期时,PID文件应自动消失。

如果文件不可写或者文件已经存在并且已被锁定,则不会进行任何异常处理。如果脚本收到 CNTRL + C 并自动删除PID文件,END将启动。

您要添加的其他内容将是对现有PID文件的测试,在创建后锁定文件以使其无法覆盖,这可以通过使用独占锁保持打开来完成(请参阅{{3 }})。

答案 1 :(得分:2)

如果在后台运行该命令,则可以存储pid:

bundle exec clockwork clock_local.rb & echo $! > tmp/pids/clockwork.pid