仅对特定/专用 pid 运行进程

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 和名称开始。另一种选择是在 pid 文件中记录 `pid -o lstart= -p "$!"`(如果在 Linux 上)的输出,并在终止进程时进行比较。 (2认同)

Sté*_*las 6

修复 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。