我想知道是否有一些方法可以强制使用一些特定的进程ID到Linux的一些应用程序之前运行它。我需要提前知道进程ID。
2cmtqfgy1#
实际上,有一种方法可以做到这一点。自从kernel 3.3设置了CONFIG_CHECKPOINT_RESTORE(大多数发行版都设置了),就有了/proc/sys/kernel/ns_last_pid,它包含了内核生成的最后一个pid。所以,如果你想为forked程序设置PID,你需要执行以下操作:1.打开/proc/sys/内核/ns_last_pid并获取fd1.使用LOCK_EX将其群集1.写入PID-11.叉好了!孩子会有你想要的PID。另外,不要忘记解锁(flock with LOCK_UN)并关闭ns_last_pid。你可以在我的博客here上查看C代码。
sgtfey8w2#
正如许多人已经建议的那样,您不能直接设置PID,但通常shell具有了解哪个是最后派生的进程ID的功能。例如,在bash中,你可以在后台运行一个可执行文件(附加&),并在变量$!中找到它的PID。
&
$!
$ lsof >/dev/null & [1] 15458 $ echo $! 15458
f87krz0w3#
在CentOS7.2上,您只需执行以下操作:假设您想要执行PID为1894的sleep命令。
sudo echo 1893 > /proc/sys/kernel/ns_last_pid; sleep 1000
(但是,请记住,如果碰巧在echo和sleep命令之间的极短时间内执行了另一个进程,您可能会得到一个1895+的PID。我已经测试了数百次,但从未发生过这种情况。如果您想保证PID,则需要在写入文件后锁定该文件,执行sleep,然后按照上面Ruslan回答中的建议解锁文件。)
xqk2d5yq4#
没有办法强制为进程使用特定的PID。正如Wikipedia所说:进程ID通常按顺序分配,从0开始,一直增加到最大值,该值因系统而异。一旦达到此限制,分配将从300重新开始并再次增加。在Mac OS X和HP-UX中,分配将从100重新开始。但是,对于此传递和后续传递,将跳过仍分配给进程的任何PID
b4lqfgs45#
您可以重复调用fork()来创建新的子进程,直到您得到一个具有所需PID的子进程。记住经常调用wait(),否则您将很快达到每个用户的进程限制。这种方法假设操作系统按顺序分配新的PID,例如在Linux 3.3上似乎就是这种情况。与ns_last_pid方法相比,它的优点是不需要root权限。
fork()
wait()
ns_last_pid
ugmeyewa6#
Linux系统上的每个进程都是由 fork() 生成的,所以应该没有办法强制指定一个特定的PID。
vohkndzv7#
从Linux 5.5开始,你可以将PID数组传递给clone3系统调用,并分配给新进程,从内到外,每个嵌套的PID命名空间最多一个PID数组。这需要在PID命名空间上使用CAP_SYS_ADMIN或CAP_CHECKPOINT_RESTORE(从Linux 5.9开始)。如果你不关心PID命名空间,使用一个大小为1的数组。
clone3
CAP_SYS_ADMIN
CAP_CHECKPOINT_RESTORE
7条答案
按热度按时间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代码。
sgtfey8w2#
正如许多人已经建议的那样,您不能直接设置PID,但通常shell具有了解哪个是最后派生的进程ID的功能。
例如,在bash中,你可以在后台运行一个可执行文件(附加
&
),并在变量$!
中找到它的PID。f87krz0w3#
在CentOS7.2上,您只需执行以下操作:
假设您想要执行PID为1894的sleep命令。
(但是,请记住,如果碰巧在echo和sleep命令之间的极短时间内执行了另一个进程,您可能会得到一个1895+的PID。我已经测试了数百次,但从未发生过这种情况。如果您想保证PID,则需要在写入文件后锁定该文件,执行sleep,然后按照上面Ruslan回答中的建议解锁文件。)
xqk2d5yq4#
没有办法强制为进程使用特定的PID。正如Wikipedia所说:
进程ID通常按顺序分配,从0开始,一直增加到最大值,该值因系统而异。一旦达到此限制,分配将从300重新开始并再次增加。在Mac OS X和HP-UX中,分配将从100重新开始。但是,对于此传递和后续传递,将跳过仍分配给进程的任何PID
b4lqfgs45#
您可以重复调用
fork()
来创建新的子进程,直到您得到一个具有所需PID的子进程。记住经常调用wait()
,否则您将很快达到每个用户的进程限制。这种方法假设操作系统按顺序分配新的PID,例如在Linux 3.3上似乎就是这种情况。
与
ns_last_pid
方法相比,它的优点是不需要root权限。ugmeyewa6#
Linux系统上的每个进程都是由 fork() 生成的,所以应该没有办法强制指定一个特定的PID。
vohkndzv7#
从Linux 5.5开始,你可以将PID数组传递给
clone3
系统调用,并分配给新进程,从内到外,每个嵌套的PID命名空间最多一个PID数组。这需要在PID命名空间上使用CAP_SYS_ADMIN
或CAP_CHECKPOINT_RESTORE
(从Linux 5.9开始)。如果你不关心PID命名空间,使用一个大小为1的数组。