저는 종종 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
몇 가지 백그라운드 프로세스를 실행 해보십시오 .