Sh에서 프로세스를 분리하거나 "해제"(Bash 아님)

Sh에서 프로세스를 분리하거나 "해제"(Bash 아님)

Bash 대신 Sh에 의해 실행되는 쉘 스크립트를 생각해 보십시오(변경할 수도 없고 shebang을 사용할 수도 없으며 무시됩니다). 교환원은 &일하지만 disown $!일하지 않아요, Sh가 불평하게 해주세요"거부: 찾을 수 없음".

특정 Sh에서 백그라운드 프로세스를 분리하는 방법은 무엇입니까? 내 말은 Sh에서 수행하는 작업이 disownBash에서 수행하는 작업과 동일하다는 것입니다.

답변1

먼저 Bash 명령이 수행하는 작업을 살펴보겠습니다 disown. ~에서배쉬 매뉴얼:

SIGHUP대화형 셸은 종료하기 전에 SIGHUP실행 중이거나 중지된 모든 작업을 다시 보냅니다. 중지된 작업을 전송하여 SIGCONT수신되었는지 확인합니다 SIGHUP. 쉘이 SIGHUP특정 작업에 신호를 보내는 것을 방지하려면 disown 내장 함수(작업 제어 내장 참조)를 사용하여 작업 테이블에서 제거하거나 SIGHUP수신하지 않도록 표시 해야 합니다. disown 내장 함수 disown -h.

huponexit쉘 옵션이 설정된 경우 shopt(Shopt 내장 참조) SIGHUPBash는 대화형 로그인 쉘이 종료될 때 모든 작업에 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 셸에는 disownBash, Ksh 및 기타 일부 셸에 있는 내장 기능이 없으므로 다른 도구가 필요합니다. 그 도구는nohup(1). 위 스크립트에서 우리는 하위 프로세스의 합계 stdout에 관심이 없으며 다음을 피하기 stderr위해 다음과 같이 수정할 수 있습니다 .sleepSIGHUP

#!/bin/sh
nohup sleep 55555 >/dev/null 2>&1 &
sleep 3333 # some long operation we don't care about

리디렉션은 현재 디렉터리에서 파일을 가져오는 것을 /dev/null방지하는 것입니다 . nohup.out리디렉션이 없으면 이 파일에는 nohupped 프로세스의 출력이 포함됩니다.

관련 정보