gpt4 book ai didi

linux - 从 bash 脚本启动进程时的不同 pid

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:42 26 4
gpt4 key购买 nike

我正在编写 init.d 脚本,但在保存 fork 进程 pid 时遇到了一些问题。

这是我的初始化脚本片段:

sudo -u $USER nohup -- nice -n "0" java Test >> /dev/null 2>&1 < /dev/null &
NEWPID="$!"
echo $NEWPID

但是当我运行这个脚本时,我打印了以下 pid

$./scr.sh
4595

但是

$ps  | grep java
4596 pts/23 00:00:01 java

如您所见,pid 是不同的(45964595)。但是,如果尝试编写以下内容:

java Test &
NEWPID="$!"
echo $NEWPID

我得到了正确的结果:

$./scr.sh
4653
$ps | grep java
4653 pts/23 00:00:03 java

第一个有什么问题?

最佳答案

在效率低下的世界中,会涉及多个流程:

<the shell>   1234
|
|
sudo 4595
|
|
nohup 4596
|
|
nice 4597
|
|
java 4598

$!仅指shell本身在后台启动的进程,也就是运行sudo的进程。 java,您感兴趣的进程在进程 4598 中。您需要使用 ps(或其他一些工具)来获取该进程 ID,作为 shell不会知道的。


真实世界中,并没有涉及那么多进程,因为并非上述链中的每个作业都必须 fork 一个新进程;他们中的一些人可以简单地使用 exec 将自己替换为他们运行的程序。我认为 sudonice 都这样做(nohup 必须在不同的进程组中启动一个新进程让它做它做的事)。所以链条看起来更像

<the shell>      1234
|
|
sudo/nohup 4595
|
|
nice/java 4596

但最终结果是一样的; shell 无法获取 java 最终运行的进程的进程 ID。

关于linux - 从 bash 脚本启动进程时的不同 pid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50397826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com