次の(編集された)スクリプトがあります。
#!/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
常に少なくとも1つの結果、つまり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
プロセスが1時間以上実行された場合は、そのプロセスを終了したいと思います。少なくとも私考えるこれは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
指示するため、経過時間(2番目のフィールド、)が1時間(3600秒)より大きいことを確認し、そうであれば最初のフィールドであるPIDを出力します。 。したがって、結果は1時間以上実行されたプロセスのPIDのリストになります。これにより、このリストがコマンドに提供されます。ps
awk
$2
ps ... | awk
cata
kill -9
答え2
実際に忘れる前に1つを追加してください'
。;
if ps -lf | grep cata | perl -ane '($h,$m,$s) = split /:/,$F +[13]; kill 9, $F[3] if ($h > 1)'; then