스크립트에서 이런 방식으로 시작된 xterm 프로세스를 종료하고 싶습니다.
#!/bin/bash
echo "#!/bin/bash" > /tmp/test0
grep file | awk '{print "xterm -hold -e echo",$1,"sleep 10" && pid=$!}' >> /tmp/test0
echo "exit" >> /tmp/test0
chmod 700 /tmp/test0
bash /tmp/test0&
sleep 5
kill $pid ---> does not work
exit
이제 동일한 bash(test0)에서 이런 방식으로 여러 xterm을 시작한다고 가정합니다. 해당 PID를 배열에 저장하고 종료해야 할 때 콜백하는 방법이 있습니까? 또한 이러한 값을 저장할 때 콜백을 더 쉽게 하기 위해 다른 값(이 경우 $1)과 연결하는 방법이 있습니까? 참고: $1 = 텍스트
매우 감사합니다!
답변1
다음을 사용하여 스크립트를 실행하는 경우:
bash /tmp/test0&
완전히 별도의 프로세스를 시작 bash
하고 이를 백그라운드에 배치합니다. 이 스크립트에 정의된 변수는 다른 프로세스에 속해 있으므로 볼 수 없습니다. 다른 파일에 정의된 변수에 접근하려면 bash
다음 명령을 사용하여 해당 파일을 현재 프로세스에 로드하세요..
또는 source
명령:
. /tmp/test0
이후에는 $pid
메인 스크립트에 입력하여 다른 파일에 설정된 값을 가져올 수 있습니다.
즉, 사물을 구조화하는 방식은 매우 혼란스럽습니다. 귀하가 게시한 스크립트에는 질문을 편집할 때 실제 오류로 인해 발생한 것으로 생각되는 다른 오류가 많이 있습니다. (이를 변수 $!
인 것처럼 사용하고 있지만 awk
복사하는 변수가 정의되기를 기대합니다.) 예를 들어 Bash 스크립트에서는 test0
많은 구문 오류가 발생합니다). $!
Bash에서만 정의됨&를 사용하여 백그라운드 프로세스를 실행한 후awk
: 명령이 유효 하더라도 $pid
비어 있습니다 . 이런 방식 으로 프로세스의 PID를 얻으려면 명령 대신 백그라운드에 스크립트를 넣어서 xterm
실행해야 합니다 xterm ... &
.bash /tmp/test0 &
test0
xterm
test0
완전히 제거하고 xterm
기본 스크립트에서 시작하는 것이 더 나을 것 같습니다 .어쩌면 더 높은 수준에서 사물에 접근하는 방법을 다시 생각해 볼 가치가 있을 수도 있습니다.. 최소한 실제 test0
파일에 무엇이 있는지 살펴보고 그것이 실제로 원하는 것인지 확인하십시오.
답변2
(Bash 스크립트가 실행되고 있지 않습니다. 오류가 있습니다.)
그렇다면 왜 PID는 죽지 않습니까? pid가 잘못된건가요? 아니면 강제로 죽여야 할까요 kill -9
?
그런 다음 pgrep
pid를 가져오는 데 사용합니다. 새 xterm을 생성하고 xtermPid_1에 pid를 저장합니다.
$ xtermPid_1=$(pgrep --newest xterm)
(pgrep의 매뉴얼 페이지를 살펴보세요. 훌륭한 도구입니다.)