터미널을 닫은 후에도 스크립트의 백그라운드 프로세스가 여전히 존재합니다.

터미널을 닫은 후에도 스크립트의 백그라운드 프로세스가 여전히 존재합니다.

이는 Bash 문제라기보다는 프로세스 관리/신호 처리 문제에 가깝습니다. 문제를 설명하기 위해 Bash를 사용합니다.

백그라운드 프로세스가 실행되는 Bash 스크립트를 실행하고 있습니다. 스크립트는 다음과 같습니다.

#!/bin/bash

# ...

# The background process
{ 
  while :; do
    sleep 1 && echo foo >> /path/to/some/file.txt
  done
} &

# ...

exit 0

나는 백그라운드에서 스크립트 자체를 실행하지 않을 것입니다. 간단하게 ./script.

"huponexit" 셸 옵션이 활성화되어 있으므로 shopt -s huponexit터미널이 닫힐 때 HUP 신호를 Bash로 보내 백그라운드 프로세스에 도달할 때까지 전파하게 되기를 원합니다. 백그라운드 프로세스가 신호를 무시 trap하고 신호를 무시하면 해당 프로세스도 종료되지만 이런 일은 발생하지 않습니다. 백그라운드 프로세스는 disown"ed"처럼 동작합니다.

이것은 이 문제를 설명하기 위해 제가 그린 계획입니다. 위의 설명과 구성표는 내가 해당 주제를 충분히 이해하지 못했기 때문에 잘못되었을 수 있습니다. 이것이 사실이라면 이 문제를 해결하도록 도와주세요.

여기에 이미지 설명을 입력하세요.

마치 다음과 같은 대화형 셸에서 호출된 것처럼 터미널을 닫은 후에도 백그라운드 프로세스가 종료되지 않는 이유가 궁금합니다.

rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &

확실하지는 않지만 내 질문에 대한 대답은 Bash fork()가 스크립트를 실행하는 비대화형 셸이며 다른 작업 제어 및 신호 처리 규칙 세트가 있을 수 있다는 것입니다.

답변1

그러면 매뉴얼 페이지는 우리에게 무엇을 말해주는가 huponexit?

shopt를 사용하여 huponexit 쉘 옵션이 설정된 경우 bash는 다음과 같은 경우 모든 작업에 SIGHUP을 보냅니다.대화형 로그인쉘이 종료됩니다.

편집: 로그인 쉘임을 강조했습니다.

편집 2: 상호작용도 동등한 관심을 받을 가치가 있습니다

관련 정보