Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 从bash脚本启动进程时的不同PID_Linux_Bash_Pid - Fatal编程技术网

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