내 .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
이는 견적 메시지가 표시될 때 쉘이 완료된 작업에 대한 정보만 출력하기 때문에 얻을 수 있는 인상입니다.예를 들어이것bash
맨페이지:
작업 상태가 변경될 때마다 셸은 즉시 학습합니다. 일반적
bash
으로 다른 출력을 중단하지 않도록 작업 상태 변경을 보고하라는 메시지가 인쇄될 때까지 기다리십시오. 내장 명령의 옵션이 활성화된 경우-b
이러한 변경 사항은 즉시 보고됩니다. 종료되는 각 하위 프로세스에 대해 모든 트랩이 실행됩니다.set
bash
SIGCHLD
그래서 무슨 일이 일어나는가?
ss
백그라운드에서 실행되도록 시작합니다 .- 쉘은 다음 프롬프트를 인쇄합니다.
- 백그라운드 작업이 완료되었지만 셸은 아직 아무것도 출력하지 않았습니다.
- 다음 명령(모든 명령
ss
등cd
)을 실행합니다. - 쉘은 다음 프롬프트를 인쇄하고, 이 작업을 수행하고 있으므로 완료된 작업에 대한 종료 메시지를 인쇄합니다...
를 실행하면 실제로 무슨 일이 일어나는지 확인할 수 있으므로 set -b
셸은 완료된 작업의 종료 상태를 인쇄하기 전에 프롬프트를 기다리지 않습니다.