몇 초(최대 10초) 동안 기다린 다음 몇 가지 명령을 실행해야 하는 bash 스크립트를 만들고 있습니다. 이는 프로그램이 시작될 때 나에게 필요하지 않은 쓸모없는 하위 프로세스도 시작되기 때문입니다. 하지만 제가 말했듯이 이 작업을 시작하는 데 몇 초가 걸리므로 제가 한 일은 다음과 같습니다.
here is where the program is started && sleep 20 && kill `ps -x | grep explorer.ex[e] | awk '{print $1}'` && kill `ps -x | grep winewrapper.ex[e] | awk '{print $1}'`
하지만 sleep
절전 모드가 된 후에는 kill 명령을 실행하지 않고 대신 수동으로 실행해야 하는데 이는 이 스크립트의 요점에서 벗어납니다. 어떻게 해야 하나요? 내가 sleep
잘못된 명령을 사용했나요 ?
편집: 이 질문은 비공개로 요청되었으므로 명확히 해야 한다고 생각했습니다.
프로세스가 sleep
깨어나지 않고 pkill
명령이 실행되지 않습니다. 전체 스크립트는 다음과 같습니다(AppleScript이지만 AppleScript에서 Unix 스크립트를 실행하고 있습니다).
do shell script "killall applet && cd /Applications/Dishonored.app/Contents/Resources/Dishonored/Binaries/Win32 && /Applications/CrossOver.app/Contents/SharedSupport/CrossOver/bin/wine --bottle ny\\ flaska\\ 2 Dishonored.exe && sleep 20 && kill `ps -x | grep explorer.ex[e] | awk '{print $1}'` && kill `ps -x | grep winewrapper.ex[e] | awk '{print $1}'`"
sleep
20초 후에 깨어나 pkill
명령을 계속하려면 어떻게 해야 합니까 ?
답변1
귀하가 요청하는 내용이 명확하지 않지만 여기에 문제의 가능한 원인이 몇 가지 있습니다.
kill
먼저 지나치게 복잡한 명령을 제거해 보겠습니다 . 이것은 실제 질문은 아니지만 다음으로 전환하면 나머지 답변과 최종 솔루션이 더 명확해집니다.pkill
. 단일 명령 ps
에서 +++파이핑하는 것과 동일한 작업을 수행합니다 grep
. 더 효율적이고 입력하기 쉬울 뿐만 아니라 결과 에서 명령을 필터링하기 위해 정규식 트릭이 필요하지 않습니다. 이는 조기 파이프 손상을 유발하는 일반적인 실수로, 종료되어야 하는 프로세스가 계속 실행되도록 허용합니다. 귀하의 패턴은 이러한 실수를 방지하지만 이러한 필요성을 잊어버리기 쉽습니다. 귀하의 질문을 보면 OS X를 사용하고 계시다는 것을 알 수 있습니다.awk
kill
grep
ps
grep
하다가지다 pkill
. 프로세스 이름보다는 명령의 인수를 일치시켜야 하지만 이를 위해 플래그를 사용할 수 있습니다 -f
.
이것이 배제되면 문제의 첫 번째 가능한 원인은 초기 명령이 오류 코드와 함께 종료될 수 있다는 것입니다. 연산자를 사용하고 있으므로 &&
첫 번째 명령이 0 종료 코드("오류 없음"을 의미)를 반환하는 경우에만 후속 명령이 실행됩니다. 어쨌든 이 명령을 실행하려면 다음을 사용해야 합니다 ;
.
./myprogram ;
sleep 20 &&
pkill -f explorer.exe &&
pkill -f winewrapper.exe
두 스타일을 혼합하는 것이 가능하다는 점에 유의하세요. 우리가 말하는 것은 " 무조건 실행 하고 종료될 때까지 기다린 다음 명령 체인을 계속하려면 성공적으로 반환 되어야 myprogram
하는 나머지 항목을 실행합니다." 입니다. 두 번째 단계를 원합니다. 어쨌든 단계가 실행되면 두 번째 단계 도 해당 단계로 전환합니다 .sleep
pkill
&&
;
kill
또 다른 가능성은 다음 명령을 실행 하려는 것입니다.하지만Wine/CrossOver는 아직 실행 중입니다 Dishonored.exe
. 즉, Wine이 종료된 후 20초가 아닌, Wine이 시작된 후 20초 후에 종료를 시작하려는 것입니다. 이 프로그램이 백그라운드로 포크되지 않는 한 후자의 동작을 얻게 됩니다. 병렬 동작을 원한다면 첫 번째 프로그램을 백그라운드에 배치해야 합니다.
./myprogram &
sleep 20 &&
pkill -f explorer.exe &&
pkill -f winewrapper.exe
&
첫 번째 명령을 종료하는 것은 ;
나머지 명령 문자열이 myprogram
시작 후 즉시 실행되기 시작한다는 점을 제외하면 이전 예와 매우 유사합니다.