gan*_*ars 7 process kill job-control pid
我有我想经常运行的 ac 程序可执行文件或 shell 脚本。如果我想停止/暂停或通知某事,我将向该进程发送信号。所以每次我必须检查pid
那个进程的时候,我必须用它kill
来发送一个信号。
每次我必须检查pid并记住系统关闭时,真的很糟糕。我希望该进程pid
只能像init
总是在 1 上运行一样运行。
是否有任何 C api?并且还需要bash程序的脚本。
gol*_*cks 12
我认为您不能保留或分配 PID。但是,您可以在这样的脚本中启动您的流程:
myprocess &
echo "$!" > /tmp/myprocess.pid
Run Code Online (Sandbox Code Playgroud)
这会创建一个“pid 文件”,正如其他一些人所提到的。然后,您可以在 bash 中使用例如$(</tmp/myprocess.pid)
或$(cat /tmp/myprocess.pid)
.
执行此操作时请注意,如果进程终止并且 pid 被回收,您将发出错误信号。您可以通过以下方式检查:
pid=$(cat /tmp/myprocess.pid)
if [ "$(ps -o comm= -p "$pid")" = "myprocess" ]; then
...send your signal...
else echo "Myprocess is dead!"
fi
Run Code Online (Sandbox Code Playgroud)
如果"$(ps -o comm= -p "$pid")"
您觉得奇怪,请查看评论。如果有人对/tmp/myprocess.pid
(其他用户不应该写的!)
修复 pid 绝对是解决您问题的错误解决方案,但请注意,对于某些版本的 Linux,您可以通过向 写入值来获得更好的机会获得所需的 pid /proc/sys/kernel/ns_last_pid
:
echo 9999 | sudo tee /proc/sys/kernel/ns_last_pid; ps -C ps
9999
PID TTY TIME CMD
10000 pts/3 00:00:00 ps
Run Code Online (Sandbox Code Playgroud)
这仅在 pid 10000 尚未使用时才有效(并且在您写入 ns_last_pid 和生成进程/线程之间没有 pid 或线程创建)。
否则,你总是可以 fork 直到你得到你喜欢的 pid。