如何在Linux中为特定程序设置进程ID

Bor*_*aso 20 linux process set

我想知道是否有某种方法可以在运行之前强制将某些特定的进程ID用于Linux.我需要提前知道进程ID.

Rus*_*iev 26

实际上,有一种方法可以做到这一点.由于内核3.3设置了CONFIG_CHECKPOINT_RESTORE(在大多数发行版中设置),因此/ proc/sys/kernel/ns_last_pid包含内核生成的最后一个pid.因此,如果要为分叉程序设置PID,则需要执行以下操作:

  1. 打开/ proc/sys/kernel/ns_last_pid并获取fd
  2. 用LOCK_EX把它聚集起来
  3. 写PID-1
  4. 叉子

瞧!孩子将拥有你想要的PID.另外,不要忘记解锁(使用LOCK_UN进行群集)并关闭ns_last_pid.

您可以在我的博客上查看 C代码.

  • 我喜欢这个想法,但在大多数实际情况下这是一个可怕的黑客。:-D (2认同)

Ken*_*rav 7

在CentOS7.2上你可以简单地执行以下操作:

假设您要执行 PID 为 1894 的 sleep 命令。

sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
Run Code Online (Sandbox Code Playgroud)

(但是,请记住,如果碰巧另一个进程在 echo 和 sleep 命令之间的极短时间内执行,您可能会得到 PID 为 1895+ 的结果。我已经测试了数百次,但从未发生过这种情况如果你想保证 PID,你需要在写入文件后锁定文件,执行睡眠,然后按照上面 Ruslan 的答案中的建议解锁文件。)


Eli*_*ini 5

正如许多人已经建议的那样,您不能直接设置PID,但是通常Shell会知道哪些是最后的分叉进程ID。

例如,在bash中,您可以在后台执行一个可执行文件(追加&),然后在变量中找到其PID $!。例:

$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
Run Code Online (Sandbox Code Playgroud)