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

kupeojn6  于 2023-02-18  发布在  Linux
关注(0)|答案(7)|浏览(414)

我想知道是否有一些方法可以强制使用一些特定的进程ID到Linux的一些应用程序之前运行它。我需要提前知道进程ID。

2cmtqfgy

2cmtqfgy1#

实际上,有一种方法可以做到这一点。自从kernel 3.3设置了CONFIG_CHECKPOINT_RESTORE(大多数发行版都设置了),就有了/proc/sys/kernel/ns_last_pid,它包含了内核生成的最后一个pid。所以,如果你想为forked程序设置PID,你需要执行以下操作:
1.打开/proc/sys/内核/ns_last_pid并获取fd
1.使用LOCK_EX将其群集
1.写入PID-1
1.叉
好了!孩子会有你想要的PID。另外,不要忘记解锁(flock with LOCK_UN)并关闭ns_last_pid。
你可以在我的博客here上查看C代码。

sgtfey8w

sgtfey8w2#

正如许多人已经建议的那样,您不能直接设置PID,但通常shell具有了解哪个是最后派生的进程ID的功能。
例如,在bash中,你可以在后台运行一个可执行文件(附加&),并在变量$!中找到它的PID。

$ lsof >/dev/null &
[1] 15458
$ echo $!
15458
f87krz0w

f87krz0w3#

在CentOS7.2上,您只需执行以下操作:
假设您想要执行PID为1894的sleep命令。

sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000

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

xqk2d5yq

xqk2d5yq4#

没有办法强制为进程使用特定的PID。正如Wikipedia所说:
进程ID通常按顺序分配,从0开始,一直增加到最大值,该值因系统而异。一旦达到此限制,分配将从300重新开始并再次增加。在Mac OS X和HP-UX中,分配将从100重新开始。但是,对于此传递和后续传递,将跳过仍分配给进程的任何PID

b4lqfgs4

b4lqfgs45#

您可以重复调用fork()来创建新的子进程,直到您得到一个具有所需PID的子进程。记住经常调用wait(),否则您将很快达到每个用户的进程限制。
这种方法假设操作系统按顺序分配新的PID,例如在Linux 3.3上似乎就是这种情况。
ns_last_pid方法相比,它的优点是不需要root权限。

ugmeyewa

ugmeyewa6#

Linux系统上的每个进程都是由 fork() 生成的,所以应该没有办法强制指定一个特定的PID。

vohkndzv

vohkndzv7#

从Linux 5.5开始,你可以将PID数组传递给clone3系统调用,并分配给新进程,从内到外,每个嵌套的PID命名空间最多一个PID数组。这需要在PID命名空间上使用CAP_SYS_ADMINCAP_CHECKPOINT_RESTORE(从Linux 5.9开始)。
如果你不关心PID命名空间,使用一个大小为1的数组。

相关问题