我碰到一个正在运行的脚本(myDir/myScript.sh arg1 arg2 &)
为什么要从子shell /为什么parens在(someCommand&)中启动后台进程?
从我的理解,它在子shell中运行脚本,并且在该子shell的后台运行。
会不会有什么副作用,如果我不跑了,创造新的子shell括号中的脚本myDir/myScript.sh arg1 arg2 &
?
我碰到一个正在运行的脚本(myDir/myScript.sh arg1 arg2 &)
为什么要从子shell /为什么parens在(someCommand&)中启动后台进程?
从我的理解,它在子shell中运行脚本,并且在该子shell的后台运行。
会不会有什么副作用,如果我不跑了,创造新的子shell括号中的脚本myDir/myScript.sh arg1 arg2 &
?
通常的原因为在子shell运行它是使得壳不打印的消息的背景处理开始和结束时。另外,如果脚本曾经使用wait
命令,它将不会等待在子壳体中启动的后台进程(一个进程只能等待自己的子进程而不是子进程)。
这也意味着脚本无法获得后台进程的退出状态,如果它是在子shell中启动的 - 您需要使用wait
来获得该状态。并且$!
变量不会被设置为后台进程的PID(它在子shell中设置,而不是原始shell进程)。
基本上,如果原始shell不需要处理后台进程,就使用(command&)
,它只是想启动并忘记它。
我以为符号叉一个新的进程在后台,但这与subhell有什么不同? – avaldez1412
每个非内置命令都会分叉一个新进程。 &符号使该进程在后台运行,这意味着原始shell继续运行而不必等待它完成。 – Barmar
'()'分叉了一个新的shell进程,那么这个subshell就派生出一个新的进程,无论是前台还是后台,这取决于是否存在'&'。 – Barmar
这是双叉的外壳等效物。见https://stackoverflow.com/questions/881388/what-is-the-reason-for-performing-a-double-fork-when-creating-a-daemon –