나는 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
사용할 수 있는 모든 신호 목록이 표시됩니다.