일치하는 ""를 찾는 동안 예기치 않은 EOF가 발생했습니다.

일치하는 ""를 찾는 동안 예기치 않은 EOF가 발생했습니다.

다음과 같은 (편집된) 스크립트가 있습니다.

#!/bin/bash

set -x

if ps -lf | grep cata |  perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1); then
   ...    
else
   ...
fi
set +x

이 스크립트를 실행할 때 다음 오류가 발생합니다.

/bin/kill.sh: line 8: unexpected EOF while looking for matching `''
/bin/kill.sh: line 20: syntax error: unexpected end of file

뭐가 문제 야?

답변1

perl아직 명령을 닫지 않았습니다 . 그것은 이어야 하며 perl 'foo'당신은 그것을 해냈습니다 perl 'foo. 스크립트를 다음과 같이 변경하세요.

if ps -lf | grep cata |  
    perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1)'; then

그러면 구문 오류가 해결됩니다. 그러나 스크립트는 여전히 예상대로 작동하지 않습니다. 첫째, 를 실행하면 ps | grep foo항상 최소한 하나의 결과, 즉 grep 프로세스 자체를 얻게 됩니다.

$  ps -lf | grep cata
0 S terdon    6400  4889  0  80   0 -  3183 -      19:03 pts/0    00:00:00 grep --color cata

perl둘째, 일치 여부에 따라 다른 상태로 종료하도록 스크립트에 지시하지 않습니다 . 따라서 ifPerl 스크립트는 유용한 작업을 수행하는지 여부에 관계없이 항상 실행되므로 조건은 항상 true입니다 .


게다가, 당신은 바퀴를 재발명하고 있습니다. 내가 올바르게 이해했다면 cata프로세스가 한 시간 이상 실행된 경우 해당 프로세스를 종료하고 싶을 것입니다. 적어도 나생각하다이것이 Perl 스크립트가 수행할 것으로 예상되는 작업입니다(그렇지는 않지만 괜찮습니다). 그렇다면 필요한 것은 다음과 같습니다.

kill -9 $(ps -o pid=,etimes= -p $(pgrep cata) | awk '$2>3600{print $1}')

여기에는 약간의 설명이 필요할 수 있습니다. 옵션을 사용하여 특정 PID만 나열하도록 명령 ps에 지시할 수 있으며 , 여기에서는 PID와 경과 시간을 초 단위로 인쇄하도록 지시합니다. 이 명령은 주어진 패턴과 일치하는 모든 PID를 인쇄합니다. 따라서 프로세스와 일치하는 모든 프로세스에서 실행됩니다 .-p-opgrepps -p $(pgrep cata)psPIDcata

플래그 는 PID와 경과 시간만 출력하도록 -o지시하므로 경과 시간(두 번째 필드, )이 1시간(3600초)보다 큰지 확인하고, 그렇다면 첫 번째 필드인 PID를 출력합니다. . 따라서 결과는 한 시간 이상 실행된 프로세스의 PID 목록이 됩니다. 그러면 이 목록이 명령에 제공됩니다.psawk$2ps ... | awkcatakill -9

답변2

실제로 잊어버리기 전에 하나를 추가하세요 '.;

if ps -lf | grep cata | perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1)'; then

관련 정보