在我的 .bashrc 中
alias ss="sudo sh -c '/usr/bin/nohup /usr/local/bin/sslocal -c /etc/ss.json > /var/log/ss.log 2>&1' & "
第一次运行ss。
debian9@hwy:~/workspace$ ss
[1] 9710
第二次运行ss
debian9@hwy:~/workspace$ ss
[2] 9728
[1] Exit 1 sudo sh -c '/usr/bin/nohup /usr/local/bin/sslocal -c /etc/ss.json > /var/log/ss.log 2>&1'
第二个命令导致第一个命令退出。
为什么?
现在运行命令cd
debian9@hwy:~/workspace$ cd
[2]+ Exit 1 sudo sh -c '/usr/bin/nohup /usr/local/bin/sslocal -c /etc/ss.json > /var/log/ss.log 2>&1' (wd: ~/workspace)
(wd now: ~)
为什么cd
会导致退出ss
?
答案1
这只是您得到的印象,因为您的 shell 仅在输出提示时输出有关已完成作业的信息;引用例如这bash
联机帮助页:
每当作业改变状态时,shell 都会立即学习。通常,
bash
等到要打印提示时才报告作业状态的更改,以免中断任何其他输出。如果启用了内置命令-b
的选项,则立即报告此类更改。每个退出的子进程都会执行任何陷阱。set
bash
SIGCHLD
所以发生的事情是
- 您启动
ss
它在后台运行。 - shell 输出下一个提示符。
- 后台作业完成,但 shell 尚未输出任何内容。
- 您运行下一个命令(任何命令,
ss
等等cd
)。 - shell 输出下一个提示,并且由于它正在这样做,因此输出已完成作业的退出信息......
您可以通过运行来查看实际发生的情况set -b
,因此 shell 在输出已完成作业的退出状态之前不会等待提示。