実行に20分以上かかるサブジョブの終了

実行に20分以上かかるサブジョブの終了

したがって、サーバーでバックグラウンドジョブを実行するプロセスがいくつかあり、これらのタスクの一部は時々停止するサブプロセスを開始します。その子プロセスを殺すと、すべてが正常に戻ることがわかりました。あまりにも長い間実行されている場合は、バイナリプロセスを終了する別のスクリプトがありますが、ここでは機能しないようです。通常、次のようにすることができます。

killall --older-than 20m <process>

ところが、これらの労働者は少しトリッキーだと思います。 PSでは、次のように表示されます。

jbsmith@server:~$ ps aux | grep resque
www-data 17652  0.0  1.8 794148 145940 ?       Sl   11:03   0:05 resque-1.26.0: Processing email since 1494525823 [Email]
www-data  1026  0.0  1.9 787712 157080 ?       Sl   10:47   0:13 resque-1.26.0: Forked 17652 at 1494525823

「Forked x at x」は子プロセスであり、私が終了する必要があるプロセスです。 「Forked」と一致し、20分以上経過したプロセスを見つけて終了するために使用できる1行のコマンドはありますか?

答え1

「1行」、スクロールを減らすために2行に分割します。

ps aux | awk -v cutoff=$(( $(date +%s) - 20 * 60 ))  \
  '/resque.*Forked [0-9]+ at [0-9]+/ { if ($NF < cutoff) system("kill " $2) }'

出力指定子を使用してps出力をPID、COMM、およびARGフィールドに限定し、具体的にはCOMMとARGSと一致させることでより厳密にすることができますが、ここでは偽の肯定一致のリスクが低いようです.

関連情報