从Bash脚本手动编写PID文件


10

如何编写运行长时间运行的程序并将程序进程ID存储在单独文件中的Bash脚本?

我想要类似的东西

#!/bin/bash
exec long_running_tool
echo `ps af |grep "long_running_tool" |awk '$5 == "long_running_tool" {print $1}'` > pid_file

但是,准确地执行此操作将ps工具完成之后执行。

有没有一种方法来获取创建的进程的进程ID?


2
您的示例代码将无法正常工作,因为exec无法派生,因此shell进程将被该long_running_tool进程替换。因此,exec永不返回,也永远不会到达以下行。见help execexecve(2)
Etienne Dechamps,2011年

@ e-t172感谢您指出。然后我删除“ exec”。
DerMike 2011年

Answers:


12

您可以使用“&”在后台轻松运行该进程,然后使用“ $!”获取后台进程的PID。

#!/bin/bash
long_running_tool &
echo $! > pid_file

然后,可选地,等待$!如果要外壳程序阻塞,直到过程完成执行。


1
更新:当我使用fg时,我得到'fg:21:作业(空)不在作业控制下创建',并且脚本不会阻塞。抱歉。
DerMike 2011年

“等一下!” 应该可以与fg产生类似的效果,我可以确认它确实可以在脚本中工作。我应该在发布之前检查一下。>。>我的坏。
Jeremy Sturdivant 2011年

9
#!/bin/bash
echo $$ > fooapp.pid
exec fooapp

如前所述,exec bash指定的程序替换,并保留 PID。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.