다음과 같은 (편집된) 스크립트가 있습니다.
#!/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
둘째, 일치 여부에 따라 다른 상태로 종료하도록 스크립트에 지시하지 않습니다 . 따라서 if
Perl 스크립트는 유용한 작업을 수행하는지 여부에 관계없이 항상 실행되므로 조건은 항상 true입니다 .
게다가, 당신은 바퀴를 재발명하고 있습니다. 내가 올바르게 이해했다면 cata
프로세스가 한 시간 이상 실행된 경우 해당 프로세스를 종료하고 싶을 것입니다. 적어도 나생각하다이것이 Perl 스크립트가 수행할 것으로 예상되는 작업입니다(그렇지는 않지만 괜찮습니다). 그렇다면 필요한 것은 다음과 같습니다.
kill -9 $(ps -o pid=,etimes= -p $(pgrep cata) | awk '$2>3600{print $1}')
여기에는 약간의 설명이 필요할 수 있습니다. 옵션을 사용하여 특정 PID만 나열하도록 명령 ps
에 지시할 수 있으며 , 여기에서는 PID와 경과 시간을 초 단위로 인쇄하도록 지시합니다. 이 명령은 주어진 패턴과 일치하는 모든 PID를 인쇄합니다. 따라서 프로세스와 일치하는 모든 프로세스에서 실행됩니다 .-p
-o
pgrep
ps -p $(pgrep cata)
ps
PID
cata
플래그 는 PID와 경과 시간만 출력하도록 -o
지시하므로 경과 시간(두 번째 필드, )이 1시간(3600초)보다 큰지 확인하고, 그렇다면 첫 번째 필드인 PID를 출력합니다. . 따라서 결과는 한 시간 이상 실행된 프로세스의 PID 목록이 됩니다. 그러면 이 목록이 명령에 제공됩니다.ps
awk
$2
ps ... | awk
cata
kill -9
답변2
실제로 잊어버리기 전에 하나를 추가하세요 '
.;
if ps -lf | grep cata | perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1)'; then