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