如何运行命令并将生成的pid传递到pid文件中?
我正在寻找一个UNIX命令,但是如果有办法在Ruby中实现它,那也很好。
我试过了:
bundle exec clockwork clock_local.rb echo $! > #{current_path}/tmp/pids/clockwork.pid
它似乎将整个输出传递给pid文件而不仅仅是pid。
答案 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