Bash 대신 Sh에 의해 실행되는 쉘 스크립트를 생각해 보십시오(변경할 수도 없고 shebang을 사용할 수도 없으며 무시됩니다). 교환원은 &
일하지만 disown $!
일하지 않아요, Sh가 불평하게 해주세요"거부: 찾을 수 없음".
특정 Sh에서 백그라운드 프로세스를 분리하는 방법은 무엇입니까? 내 말은 Sh에서 수행하는 작업이 disown
Bash에서 수행하는 작업과 동일하다는 것입니다.
답변1
먼저 Bash 명령이 수행하는 작업을 살펴보겠습니다 disown
. ~에서배쉬 매뉴얼:
SIGHUP
대화형 셸은 종료하기 전에SIGHUP
실행 중이거나 중지된 모든 작업을 다시 보냅니다. 중지된 작업을 전송하여SIGCONT
수신되었는지 확인합니다SIGHUP
. 쉘이SIGHUP
특정 작업에 신호를 보내는 것을 방지하려면 disown 내장 함수(작업 제어 내장 참조)를 사용하여 작업 테이블에서 제거하거나SIGHUP
수신하지 않도록 표시 해야 합니다. disown 내장 함수disown -h
.
huponexit
쉘 옵션이 설정된 경우shopt
(Shopt 내장 참조)SIGHUP
Bash는 대화형 로그인 쉘이 종료될 때 모든 작업에 a를 보냅니다.
이는 쉘 자체가 이를 수신하면 SIGHUP
이를 백그라운드 작업으로 전달한다는 것을 의미합니다. 쉘이 종료되고 huponexit
활성화되지 않은 경우 터미널을 제어하지 않는 백그라운드 프로세스는 SIGHUP
터미널을 닫지 않습니다.
SIGHUP
따라서 문제가 쉘 래퍼에서 시작된 프로세스를 차단하는 것이라면 다음과 같습니다.
#!/bin/sh
my-command arg &
disown
그런 다음 비슷한 기능이 필요하지 않습니다 . 왜냐하면 쉘 my-command
이 종료하기 전에 그것을 얻지 않는 한 쉘이 그것을 받지 않기 때문입니다.SIGHUP
그러나 다음과 같이 하위 항목을 시작한 후에도 잠시 동안 계속 실행되는 스크립트에서 하위 항목을 실행하려는 경우 여전히 문제가 있습니다.
#!/bin/sh
sleep 55555 &
sleep 3333 # some long operation we don't care about
sleep 55555
위 스크립트는 스크립트의 제어 터미널이 닫히면 명령을 종료합니다. Bourne 셸에는 disown
Bash, Ksh 및 기타 일부 셸에 있는 내장 기능이 없으므로 다른 도구가 필요합니다. 그 도구는nohup(1)
. 위 스크립트에서 우리는 하위 프로세스의 합계 stdout
에 관심이 없으며 다음을 피하기 stderr
위해 다음과 같이 수정할 수 있습니다 .sleep
SIGHUP
#!/bin/sh
nohup sleep 55555 >/dev/null 2>&1 &
sleep 3333 # some long operation we don't care about
리디렉션은 현재 디렉터리에서 파일을 가져오는 것을 /dev/null
방지하는 것입니다 . nohup.out
리디렉션이 없으면 이 파일에는 nohupped 프로세스의 출력이 포함됩니다.