현재 셸에서 실행 여부에 관계없이 모든 백그라운드 작업을 어떻게 종료할 수 있나요?

현재 셸에서 실행 여부에 관계없이 모든 백그라운드 작업을 어떻게 종료할 수 있나요?

~에서https://unix.stackexchange.com/a/43709/674

다음에서 kill관리하는 모든 백그라운드 작업 의 경우bash

kill $(jobs -p)

kill $(jobs -p)현재 셸에서 "실행 중인" 백그라운드 작업만 종료하고 "중지"되었거나 셸에서 다른 작업은 종료하지 않겠습니까 ?

현재 셸에서 실행 중이든 중지되었거나 다른 방식으로든 모든 백그라운드 작업을 어떻게 종료합니까?

예를 들어 다음을 실행하여 less두 개의 중지된 작업을 만들었습니다 ctrl+z.

$ ps | less

[1]+  Stopped                 ps | less
$ less recover_jobs.sh

[2]+  Stopped                 less recover_jobs.sh

$ jobs -l
[1]-  2753 Done                    ps
      2754 Stopped                 | less
[2]+  2842 Stopped                 less recover_jobs.sh
$ jobs -p
2753
2842

$ kill $(jobs -p)
bash: kill: (2753) - No such process
$ kill 2754
$ kill 2842
$ jobs -l
[1]-  2753 Done                    ps
      2754 Stopped                 | less
[2]+  2842 Stopped                 less recover_jobs.sh

$ fg 1
ps | less
Terminated
$ fg 2
less recover_jobs.sh
Terminated

이유를 알고 싶습니다.

  • kill $(jobs -p)stopped어떤 일자리 도 죽이지 않을 것입니다 .

  • jobs -p중지된 작업의 pid 2754를 표시하는 대신 | less완료된 작업의 pid 2753을 표시합니다 ps.

  • kill 2754kill 2842종료하지 않고 작동 | less을 멈췄습니다 less recover_jobs.sh.
  • 작업을 중단 하면 fg즉시 표시되지만 Terminated내 앞에 표시되지는 않습니까 fg?

감사해요.

답변1

kill $( jobs -p )TERM모두에게 신호를 보낼 거야일하다, 실행 여부에 관계없이. 작업에는 여러 프로세스가 포함될 수 있지만 각 작업의 첫 번째 프로세스만 신호를 받습니다(아래 참조).

첫 번째, 세 번째, 마지막 질문에 대한 답변은 동일합니다. 중지된 작업은 수행되지 않습니다.받다어떤 신호라도. 신호 처리기(기본 처리기 포함)는 프로세스에서 실행되며 프로세스는 다음과 같습니다.중지됨. 신호는출판하다작업이 재개되면.

두 번째 질문은 jobs -p프로세스의 프로세스 ID만 제공할 것이라고 생각합니다.첫 번째jobs -l모든 작업에 속한 모든 프로세스가 나열 되는 동안 파이프라인의 프로세스가 나열됩니다. 파이프를 종료하는 첫 번째 프로세스는 다음 프로세스가 읽고 있는 파일 설명자를 닫으므로 다음에 읽기를 시도할 때 파일 끝을 알립니다.

관련 정보