백엔드 작업은 어디로 갔나요?

백엔드 작업은 어디로 갔나요?

나는 gnome-terminal을 통해 Cz를 사용하여 작업을 일시 중지한 다음 백그라운드로 보낼 수 있다는 것을 알고 있습니다. 터미널을 닫아도 프로세스가 종료되지 않습니다. 작업은 어디에서 관리됩니까, 아니면 손실됩니까?

답변1

백그라운드 작업은 누군가 신호를 보내 중지하라고 지시할 때까지 계속 실행됩니다. 죽음의 방식은 다음과 같습니다.

  • 어떤 이유로든 터미널이 떠날 때,HUP 신호(모뎀 끊기에서와 같이 "끊기") 그 안에서 실행되는 셸에(더 정확하게는제어 프로세스) 그리고 그 과정포그라운드 프로세스 그룹. 따라서 백그라운드에서 실행되는 프로그램은 영향을 받지 않지만...
  • 셸은 이 HUP 신호를 수신하면 이를 백그라운드 작업에 전파합니다. 따라서 백그라운드 프로세스가 신호를 무시하지 않으면 이 시점에서 종료됩니다.
  • 터미널이 사라진 후 프로그램이 터미널에서 읽기 또는 쓰기를 시도하면 입출력 오류(EIO)로 인해 읽기 또는 쓰기가 실패합니다. 그러면 프로그램이 종료되기로 결정될 수 있습니다.
  • 물론 귀하(또는 귀하의 시스템 관리자)는 언제든지 프로그램을 종료하기로 결정할 수 있습니다.

프로그램을 계속 실행하는 것이 문제라면 다음을 수행하세요.

  • 프로그램이 터미널과 상호 작용할 수 있으면 다음을 사용하십시오.화면또는멀티플렉서가상 터미널에서 프로그램을 실행하면 마음대로 연결을 끊었다가 다시 연결할 수 있습니다.
  • 프로그램이 계속 실행되어야 하고 대화형이 아닌 경우 nohup명령( nohup myprogram --option somearg)을 사용하여 프로그램을 시작합니다. 이 명령은 쉘이 SIGHUP을 보내지 않고 표준 입력을 이름이 지정된 파일로 리디렉션 /dev/null하고 표준 출력 및 표준 오류를 Directed로 리디렉션합니다. .nohup.out
  • 프로그램을 시작했고 터미널을 닫을 때 프로그램이 종료되는 것을 원하지 않으면 disown내장 프로그램을 실행하십시오(쉘에 내장 기능이 있는 경우). 그렇지 않은 경우 극단적인 편향으로 셸을 종료하여 SIGHUP을 전파하는 셸을 피할 수 있습니다( kill -KILL $$셸에서 지정된 프로세스의 종료 트리거를 우회함).
  • 이미 프로그램을 실행했고 다른 단말기에 다시 연결하고 싶다면 몇 가지 방법이 있지만 100% 신뢰할 수는 없습니다. 바라보다실행 중인 프로세스를 거부하고 이를 새 화면 셸에 연결하는 방법은 무엇입니까?그리고 관련된 문제.

답변2

kill적절한 신호(예: 명령 사용)를 전송하여 작업을 추가로 제어할 수 있습니다.

다음을 시도해 볼 수 있습니다.

  • 일부 장기 실행 명령을 실행합니다( yes예를 들어 출력에서 ​​프로세스가 실행 중임을 알 수 있음).
  • ~에 따르면Ctrl + Z
  • 프로세스 PID를 결정합니다:pgrep yes
  • 프로세스( bg또는 와 동일 fg)를 복원하려면 다음을 사용하십시오. 여기서 이전 단계에서 결정된 프로세스 ID는 kill -CONT <PID>무엇입니까? <PID>

답변3

Ctrl+를 누르면 Z프로세스가 백그라운드로 전송되지 않고 절전 모드로 설정됩니다. fg명령(포그라운드)을 사용하여 깨울 수 있습니다 . + 프로세스에 Ctrl(19) 신호를 Z보냅니다 .SIGSTOP

다음을 증명할 수 있습니다.

  • 두 개의 터미널을 열고 그 중 하나에 이 명령을 입력하면 yes running터미널에 "running" "running" "running"이 반복적으로 인쇄됩니다.
  • CtrlZ-를 사용하면 이 명령을 사용하여 프로세스를 중지 하고 해당 PID를 찾을 수 있습니다 ps.
  • 두 번째 터미널 유형에서는 kill -19 the_previous_PID"yes" 프로세스에 동일한 효과가 있음을 알 수 있습니다.

입력하면 kill -l사용할 수 있는 모든 신호 목록이 표시됩니다.

관련 정보