一致する""の検索中に予期しない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常に少なくとも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次に、一致するかどうかによって異なる状態で終了するようにスクリプトに指示しません。したがって、ifPerlスクリプトは有用な操作を実行するかどうかにかかわらず常に実行されるため、条件は常にtrueです。


さらに、あなたは車輪を再発明しています。私が正しく理解した場合、cataプロセスが1時間以上実行された場合は、そのプロセスを終了したいと思います。少なくとも私考えるこれは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指示するため、経過時間(2番目のフィールド、)が1時間(3600秒)より大きいことを確認し、そうであれば最初のフィールドであるPIDを出力します。 。したがって、結果は1時間以上実行されたプロセスのPIDのリストになります。これにより、このリストがコマンドに提供されます。psawk$2ps ... | awkcatakill -9

答え2

実際に忘れる前に1つを追加してください';

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

関連情報