Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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 父进程没有';t使用cd xxx时退出&&;nohup sh xx.sh&;_Linux_Bash_Shell_Unix - Fatal编程技术网

Linux 父进程没有';t使用cd xxx时退出&&;nohup sh xx.sh&;

Linux 父进程没有';t使用cd xxx时退出&&;nohup sh xx.sh&;,linux,bash,shell,unix,Linux,Bash,Shell,Unix,我昨晚遇到了这个奇怪的问题,但仍然没有任何线索。事情是这样的: 我得到了两个名为parent.sh和child.sh的进程,它应该是parent.sh启动child.sh,然后parent.sh退出,而child.sh仍在运行。(parent.sh与apachectl或/etc/init.d/xxx 父.sh中的代码 #!/bin/bash echo 'start child.sh' cd $HOME && nohup sh child.sh & #!/bin/bas

我昨晚遇到了这个奇怪的问题,但仍然没有任何线索。事情是这样的:

我得到了两个名为
parent.sh
child.sh
的进程,它应该是
parent.sh
启动
child.sh
,然后
parent.sh
退出,而
child.sh
仍在运行。(
parent.sh
apachectl
/etc/init.d/xxx

父.sh中的代码

#!/bin/bash

echo 'start child.sh'
cd $HOME && nohup sh child.sh &
#!/bin/bash

while true;
do
    echo 'child process';
    sleep 10
done
child.sh中编码

#!/bin/bash

echo 'start child.sh'
cd $HOME && nohup sh child.sh &
#!/bin/bash

while true;
do
    echo 'child process';
    sleep 10
done
在我运行
sh parent.sh
之后,似乎
parent.sh
已经退出,因为我受到了重击。不幸的是,当我运行
ps-ef | grep parent.sh
时,它仍然在那里,有一个父进程
init
,子进程
child.sh
也在运行

在检查了
parent.sh
之后,我发现如果我更改此行:

cd $HOME && nohup sh child.sh &

然后父进程将在启动子进程后退出


为什么?

猜测第一种情况下,整个复杂命令放在后台,但只有
child.sh
进程与父进程分离,因此运行
cd
的shell仍然存在,直到
child.sh
退出。第二种情况下,
cd
发生在父shell中,然后
nohup
处理s被分离,因此在父shell上下文中没有任何东西可以继续运行。但这都是假设。
nohup sh-c“cd$HOME&&sh child.sh”&
工作正常吗?(如果脚本是bash脚本,则使用
bash
而不是
sh
)感谢您的回复,
sh-c
将丢失环境变量
cd$HOME
。受您启发,我认为以下是
cd$HOME&&nohup sh child.sh&
的工作原理:此命令中的
&
将使整个命令
cd$HOME&&nohup sh child.sh
在后台运行,将e> 将parent.sh
添加到后台,因此我将在终端中获得一个新的bash。然后,因为在
nohup sh child.sh
之后没有
&
(原始的
$
适用于parent.sh),因此,
nohup sh child.sh
将不会退出,因此background.sh将不会退出并保留在后台。该nohup建议中的
$HOME
将在运行前由当前shell展开。请注意双引号。第一种情况下,整个复杂命令将放在后台,但仅放在
子命令中。sh
进程与父进程分离,因此运行
cd
的shell仍然存在,直到
child.sh
退出。第二次
cd
发生在父shell中,然后分离
nohup
进程,因此在父shell上下文中没有任何东西可以继续运行。但这都是假设。
nohup sh-c“cd$HOME&&sh child.sh”&
是否正常工作?(如果脚本是bash脚本,则使用
bash
而不是
sh
)感谢您的回复,
sh-c
将丢失环境变量
cd$HOME
。受您启发,我认为以下是
cd$HOME&&nohup sh child.sh&
的工作原理:此命令中的
&
将使整个命令
cd$HOME&&nohup sh child.sh
在后台运行,将e> 将parent.sh添加到后台,因此我将在终端中获得一个新的bash。然后,因为在
nohup sh child.sh
之后没有
&
(原始的
$
适用于parent.sh),因此,
nohup sh child.sh
将不会退出,因此background.sh将不会退出并保留在后台。该nohup建议中的
$HOME
将在运行前由当前shell展开。请注意双引号。第一种情况下,整个复杂命令将放在后台,但仅放在
子命令中。sh
进程与父进程分离,因此运行
cd
的shell仍然存在,直到
child.sh
退出。第二次
cd
发生在父shell中,然后分离
nohup
进程,因此在父shell上下文中没有任何东西可以继续运行。但这都是假设。
nohup sh-c“cd$HOME&&sh child.sh”&
是否正常工作?(如果脚本是bash脚本,则使用
bash
而不是
sh
)感谢您的回复,
sh-c
将丢失环境变量
cd$HOME
。受您启发,我认为以下是
cd$HOME&&nohup sh child.sh&
的工作原理:此命令中的
&
将使整个命令
cd$HOME&&nohup sh child.sh
在后台运行,将e> 将parent.sh添加到后台,因此我将在终端中获得一个新的bash。然后,因为在
nohup sh child.sh
之后没有
&
(原始的
$
适用于parent.sh),因此nohup sh child.sh将不会退出,因此background.sh将不会退出并保留在后台。该nohup建议中的
$HOME
将在运行前由当前shell展开。请注意双引号。