Linux 从bash脚本启动进程时的不同PID
我正在编写Linux 从bash脚本启动进程时的不同PID,linux,bash,pid,Linux,Bash,Pid,我正在编写init.d脚本,在保存分叉进程pid时遇到了一些问题 以下是我的init脚本片段: sudo -u $USER nohup -- nice -n "0" java Test >> /dev/null 2>&1 < /dev/null & NEWPID="$!" echo $NEWPID 但是 正如您所看到的,pids是不同的(4596和4595)。但如果试图写以下内容: java Test & NEWPID="$!" echo $NE
init.d
脚本,在保存分叉进程pid时遇到了一些问题
以下是我的init脚本片段:
sudo -u $USER nohup -- nice -n "0" java Test >> /dev/null 2>&1 < /dev/null &
NEWPID="$!"
echo $NEWPID
但是
正如您所看到的,pid
s是不同的(4596
和4595
)。但如果试图写以下内容:
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无法获取java最终运行的进程的进程ID。在效率低下的世界中,可能会涉及多个进程:
<the shell> 1234
|
|
sudo 4595
|
|
nohup 4596
|
|
nice 4597
|
|
java 4598
但最终结果是一样的;shell无法获取
java
最终运行的进程的进程ID。请尝试打印$代码>在启动后台进程的同一个shell中:
NEWPID=$(sudo -u $USER bash -c "nohup -- nice -n 0 java Test >/dev/null 2>&1 </dev/null & echo $!")
echo $NEWPID
NEWPID=$(sudo-u$USER bash-c“nohup--nice-n0 java Test>/dev/null 2>&1尝试从启动后台进程的同一个shell中打印$!
:
NEWPID=$(sudo -u $USER bash -c "nohup -- nice -n 0 java Test >/dev/null 2>&1 </dev/null & echo $!")
echo $NEWPID
NEWPID=$(sudo-u$USER bash-c“nohup--nice-n0 java Test>/dev/null 2>&1 sudo打开一个shell,然后进程分叉重新开始您可能会获得(临时)sudo
进程的PID…没有“可能”关于它;sudo
是在后台运行的命令,所以这就是$!
报告的内容。@chepner那么在init.d脚本中使用sudo…
是一种不好的做法吗?我必须由适当的用户运行init脚本?@m47730您不能建议一种方法来修复它吗?sudo打开一个shell,然后这个过程会再次返回给您可能正在获取(临时)sudo
进程的PID…没有“可能”关于它;sudo
是在后台运行的命令,所以这就是$!
报告的内容。@chepner所以在init.d脚本中使用sudo…
是一种不好的做法?我必须由适当的用户运行init脚本?@m47730您能建议一种方法来修复吗?
NEWPID=$(sudo -u $USER bash -c "nohup -- nice -n 0 java Test >/dev/null 2>&1 </dev/null & echo $!")
echo $NEWPID