백그라운드에서 실행되는 bash 쉘 스크립트 종료 텍스트 파일에를 “a.txt”, “b.txt”,

저는 종종 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 &있습니까?



답변

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

ps -fu username

결과는 다음과 같습니다.

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


답변

몇 가지 옵션이 있습니다. 프로세스가 백그라운드에서 실행 중이므로 다음 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


답변

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

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


답변