为什么当前命令会导致前一个命令退出?

为什么当前命令会导致前一个命令退出?

在我的 .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的选项,则立即报告此类更改。每个退出的子进程都会执行任何陷阱。setbashSIGCHLD

所以发生的事情是

  1. 您启动ss它在后台运行。
  2. shell 输出下一个提示符。
  3. 后台作业完成,但 shell 尚未输出任何内容。
  4. 您运行下一个命令(任何命令,ss等等cd)。
  5. shell 输出下一个提示,并且由于它正在这样做,因此输出已完成作业的退出信息......

您可以通过运行来查看实际发生的情况set -b,因此 shell 在输出已完成作业的退出状态之前不会等待提示。

相关内容