我有一个我想经常运行的 ac 程序可执行文件或 shell 脚本。如果我想停止/暂停或通知某些事情,我将向该进程发送信号。因此,每次我必须检查pid
该进程,并且必须使用它kill
来发送信号。
每次我都必须检查 pid 并记住直到系统关闭,这真的很糟糕。pid
我希望该进程只能在特定的平台上运行就像init
总是在 1 上运行一样。
有没有相关的 C api?并且还需要 bash 程序的脚本。
答案1
我不认为你可以保留或分配 PID。但是,您可以在如下脚本中启动流程:
myprocess &
echo "$!" > /tmp/myprocess.pid
这会创建一个“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
"$(ps -o comm= -p "$pid")"
如果您觉得奇怪,请参阅评论。如果有人有可能对 的内容做一些不正当的事情/tmp/myprocess.pid
(其他用户不应该写入!),您可能需要进行更严格的验证。
答案2
修复 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
仅当 pid 10000 尚未使用时才有效(并且在写入 ns_last_pid 和生成进程/线程之间没有 pid 或线程创建)。
否则,你可以随时 fork 直到获得你喜欢的 pid。
答案3
类似于您想要做的事情通常是由进程在其生命周期早期将其自己的 pid(可以通过 获取getpid(2)
)写入具有已知名称的文件来完成。在通用守护程序中,该文件的名称通常是可配置的,但在专用软件中,您可能可以对其进行硬编码。 (不过,我强烈建议至少使用宏。)
PID 文件通常放置在 /var/run 或 /run 中,但也可以放置在其他位置,包括 /tmp。根据文件系统层次结构标准,“正确”的位置位于 /run 中,但 /var/run 也有重要用途(在许多现代系统上与 /run 相同),并且 /tmp 在启动时不需要 root 权限(系统守护进程在放弃权限之前通常拥有哪些权限)。
然后可以通过多种方式读取该文件以获得相关进程的 PID,以便向相关进程发送信号。
答案4
系统级守护进程根据启动期间的启动顺序进行分配。我相信为特定进程分配固定的 pid 是不可能的,因为它是由内核根据系统负载和其他依赖项分配的。
但是使用系统调用我们可以为进程分配一个固定的PID。但不知道如何才能实现。