백그라운드에서 실행되는 bash 쉘 스크립트 종료


16

저는 종종 bash쉘 스크립트를 사용하여 여러 파일에 대해 간단한 명령을 실행합니다. 예를 들어, 나는 다음과 같은 있다고 가정 bash라는 쉘 스크립트, script.sh프로그램 / 명령을 실행, foo세 개의 텍스트 파일에를 "a.txt", "b.txt", "c.txt":

#!/bin/bash

for strname in "a" "b" "c"
do
foo $strname".txt"
done

또한 foo $strname".txt"속도가 느리므로 스크립트 실행에 오랜 시간 (예 : 몇 시간 또는 며칠)이 걸리는 것으로 가정합니다 . 이 때문에 nohup터미널을 닫거나 연결을 끊어도 실행이 계속되도록 사용 하고 싶습니다 . 또한 스크립트가 즉시 백그라운드로 이동하기를 원하므로 &연산자 를 사용하겠습니다 . 따라서 다음 명령을 사용하여 호출합니다 script.sh.

nohup bash script.sh &

백그라운드에서 스크립트를 끊지 않고 실행하는 데에는 문제가 없지만 이제 어떤 이유로 든 실행을 종료하고 싶다고 가정합니다. 어떻게해야합니까?

내가 겪은 문제는를 보면에 해당하는 top것만 볼 수 있다는 foo"a.txt"입니다. 해당 foo호출을 종료 할 수 있지만 foo해당하는 호출 이 수신 된 다음 해당 "b.txt"호출도 종료해야합니다. for루프에 지정된 수십 또는 수백 개의 텍스트 파일의 경우 모든 foo을 하나씩 종료하는 것이 고통 스럽습니다 ! 그래서 어떻게 든 쉘 스크립트 에서 발행 된 특정 호출이 아닌 쉘 스크립트 자체 를 대신 종료해야합니다 .

내가 명령을 입력하면

ps -u myusername

myusername내 사용자 이름은 어디에서 실행중인 프로세스 목록을 얻습니다. 그러나 두 개의 다른 프로세스 ID가 표시 bash됩니다. 이 중 어떤 프로세스가 내 원래 통화에 해당하는지 어떻게 알 수 nohup bash script.sh &있습니까?


@Andrew, 두 프로세스 모두 명령에 언급 된 nohup을 표시합니까? .... 또는 ps -aWu Andrew를 사용하여 nohup으로 하나의 긴 항목을 찾을 수 있는지 확인할 수 있습니다 .... 도움이 되나요?
nitin

2
옆으로, 당신의 인용은 엉뚱합니다. for s in a b c; do foo "$s".txt; done
tripleee 2018 년

1
@NSD : 아니요 nohup. 프로세스 목록을 불러 와서 시작한 작업을 볼 때까지 시간이 오래 걸립니다. ps출력 에서 "niceness"열을 볼 수 있지만 여기에 대한 답변이 더 유용합니다.
tripleee 2016 년

답변:


9

기본적으로 ps프로그램이 호출 된 매개 변수는 표시되지 않습니다. 옵션 -f-l둘 다 전체 통화를 표시합니다.

ps -fu username

결과는 다음과 같습니다.

username 23464 66.7  0.0  11400   628 pts/5    R    15:28   1:40 bash script.sh

2
적당히 유용하지만 동일한 인수로 여러 프로세스를 명확하게하지는 않습니다.
tripleee 2016 년

11

몇 가지 옵션이 있습니다. 프로세스가 백그라운드에서 실행 중이므로 다음 jobs을 찾을 수 있습니다.

nohup bash script.sh &
...
jobs
[1]+ Running    nohup bash script.sh &
kill %1
jobs
[1]+ Terminated nohup bash script.sh &

pkill명령 행 일치에 대해 프로세스 테이블을 검색하는 데 사용할 수도 있습니다 . 즉:

pkill -f script.sh

1

ps(예와 출력 ps aux) 상위의 프로세스 ID를 포함한다. 부모를 죽이면 bash그 자식도 종료됩니다.

프로세스 트리의 ASCII 시각화를 위해 pstree -p몇 가지 백그라운드 프로세스를 실행 해보십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.