0

如何运行命令并将生成的 pid 通过管道传输到 pidfile 中?

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

我试过:

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

它似乎将整个输出传递到 pidfile 而不仅仅是 pid。

4

2 回答 2

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 文件。一分钟后,当sleepPID 文件过期时,应该会自动消失。

如果文件不可写或文件已经存在并被锁定,它们不会进行任何异常处理。如果脚本收到+END将触发并自动删除 PID 文件。CNTRLC

您要添加的其他内容是对现有 PID 文件的测试,在创建后锁定文件以使其不能被覆盖,这可以通过使用独占锁保持打开状态来完成(请参阅 参考资料flock)。

于 2013-04-20T03:45:58.100 回答
2

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

bundle exec clockwork clock_local.rb & echo $! > tmp/pids/clockwork.pid
于 2013-04-20T02:25:54.083 回答