나는 종종 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 &
?
답변1
몇 가지 옵션이 있습니다. 프로세스가 백그라운드에서 실행 중이므로 다음 명령을 사용하여 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
답변2
기본적으로 ps
프로그램 호출 시 사용된 매개변수는 표시되지 않습니다. 옵션 -f
과 -l
둘 다 전체 통화를 표시합니다.
ps -fu username
아래와 같이 출력이 생성됩니다.
username 23464 66.7 0.0 11400 628 pts/5 R 15:28 1:40 bash script.sh
답변3
출력 ps
(예: ps aux
)에는 상위 프로세스의 프로세스 ID가 포함됩니다. 상위 프로세스를 종료하면 bash
해당 하위 프로세스도 종료됩니다.
프로세스 트리의 ASCII 시각화를 위해 pstree -p
일부 백그라운드 프로세스를 실행해 보세요.