如何运行命令并将生成的 pid 通过管道传输到 pidfile 中?
我正在寻找一个 UNIX 命令,但如果有办法在 Ruby 中完成它,那也很好。
我试过:
bundle exec clockwork clock_local.rb echo $! > #{current_path}/tmp/pids/clockwork.pid
它似乎将整个输出传递到 pidfile 而不仅仅是 pid。
您可以使用 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 文件过期时,应该会自动消失。
如果文件不可写或文件已经存在并被锁定,它们不会进行任何异常处理。如果脚本收到+END
将触发并自动删除 PID 文件。CNTRLC
您要添加的其他内容是对现有 PID 文件的测试,在创建后锁定文件以使其不能被覆盖,这可以通过使用独占锁保持打开状态来完成(请参阅 参考资料flock
)。
如果在后台运行命令,则可以存储 pid:
bundle exec clockwork clock_local.rb & echo $! > tmp/pids/clockwork.pid