왜 "su -c&"는 명령이 중단되지 않고 백그라운드에서 실행되도록 허용하는 것 같습니다.

왜 "su -c&"는 명령이 중단되지 않고 백그라운드에서 실행되도록 허용하는 것 같습니다.

간헐적으로 백그라운드 프로세스가 정지되는 문제를 겪고 있는 동료를 돕고 있습니다.

서버에 로그인하고 다음 명령을 실행하여 백그라운드 프로세스를 시작하는 것으로 나타났습니다.

su - <user> -c '<command>' &

“아하.” 나는 소리쳤다. ""&"로 명령을 시작하면 제어 터미널을 종료할 때 중단됩니다. 이를 달성하려면 nohup과 같은 것을 사용해야 합니다. 프로세스는 실제로 데몬으로 실행을 지원해야 합니다."

내 주장을 입증하기 위해 위 명령을 테스트했습니다. 작동하는 것 같습니다. 프로세스는 다음에 의해 수행됩니다.주문하다위 명령을 실행한 터미널을 종료하면 종료가 없습니다.

주문하다출력이 파일에 저장되는 사용자 정의 Python 스크립트입니다. 내가 아는 한 스크립트에는 스마트 "데몬"과 같은 것이 없습니다. 데몬으로 실행하는 데 필요한 작업은 수행되지 않습니다.Wikipedia: 데몬(컴퓨팅): 창조페이지.

다음과 같은 명령을 실행하면 예상대로 작동합니다.

<command> &
exit

위의 예에서 백그라운드 프로세스는 다음에 의해 실행됩니다.주문하다터미널을 나갈 때 나가세요.

내 질문은 이것입니다:

  1. "su - -c &"를 추가하면 터미널이 종료될 때 프로세스가 종료되는 것을 방지합니다. 터미널 제어, 표준 입력 및 출력 등에 대해 자세히 알고 싶습니다.

  2. 이 명령을 백그라운드 프로세스로 실행하려는 목표를 달성하는 합리적인 방법입니까? 그렇지 않다면 왜 안 됩니까?

나는 회사 내에서 모범 사례를 전파하고 싶지만 내가 제안하는 모든 것을 입증하고 지원할 수 있어야 합니다.

나는 또한 무슨 일이 일어나고 있는지 이해하고 싶습니다.

답변1

프로세스는 최종 종료로 인해 여러 가지 방법으로 종료될 수 있습니다.

  1. 첫 번째 방법은 커널의 터미널 드라이버입니다.SIGHUP 신호 보내기도착하다제어 프로세스터미널은제어 터미널. 대부분의 경우 제어 프로세스는 터미널에서 처음 시작된 쉘이며 제어 터미널은 stdin, stdout 및 stderr이 연결된 터미널입니다. 프로세스가 호출되면 제어 터미널과의 연결이 끊어집니다.setsid.

  2. 두 번째 방법은 쉘이 SIGHUP을 수신하면 해당 신호를 하위 프로세스, 보다 정확하게는 백그라운드 작업으로 다시 보내는 것입니다. 일부 셸(ksh, bash, zsh)에는 disownSIGHUP을 특정 작업에 보내지 않도록 셸에 지시하는 명령이 내장되어 있습니다.

  3. 터미널이 사라지고 프로그램이 터미널에서 데이터를 읽으려고 하면 파일 끝 조건(또는 백그라운드 작업의 EIO)에 대한 알림을 받게 됩니다. 터미널이 사라지고 프로그램이 터미널에 쓰기를 시도하면 EIO 오류와 함께 쓰기가 반환됩니다. 이로 인해 프로그램이 종료될 수 있습니다.

따라서 su여기서 변경된 점은 (2)가 일반적으로 초기 셸이 백그라운드 작업을 종료하도록 하지만 해당 백그라운드 프로세스가 다른 사용자로 실행 중이기 때문에 신호를 전달할 수 없고 백그라운드 프로세스가 계속 존재한다는 것입니다.

관련 정보