Bash
殺死執行時間超過 20 分鐘的子作業
所以我有一些在伺服器上執行後台作業(resque)的程序,其中一些作業啟動了一個偶爾會卡住的子程序。我發現如果我殺死那個子程序,一切都會恢復正常。我們有另一個腳本可以殺死一個二進制程序,如果它執行很長時間,但它似乎在這裡不起作用。通常我可以這樣做:
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
“在 x 處分叉 x”是子程序,也是我需要殺死的子程序。是否有一個線性命令我可以用來查找可能匹配“分叉”且超過 20 分鐘的程序並殺死它們?
一個“單行”,分成兩行以減少滾動:
ps aux | awk -v cutoff=$(( $(date +%s) - 20 * 60 )) \ '/resque.*Forked [0-9]+ at [0-9]+/ { if ($NF < cutoff) system("kill " $2) }'
通過使用輸出說明符 for 將輸出限制為僅 PID 和 COMM 和 ARG 欄位,然後專門匹配 COMM 和 ARGS,可以使其更緊密
ps
,但在這裡,誤報匹配的風險似乎很低。