Linux bashスクリプトで特定のユーザーが5分以上実行しているすべてのプロセスを強制終了する


18

特定のプロセスで5分以上実行されているプロセスを強制終了するコマンドが必要です。

5分ごとにそのコマンドを実行する必要があります。

どうもありがとう !

(システムはCentos5)

linux  bash 

回答:


17
kill -9 $(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print $2}}')

ここで、「procname」はプロセス名であり、300は実行時間のしきい値です。


素晴らしいワンライナー。私は-9自分のプロセスにやさしくなることなくこれを使用し、grep -v defunct |以前にawkコマンドが有効なPIDを返さない出力にawk表示さprocname <defunct>れる可能性がある他の理由を追加しました。そして、これはkillコマンドを破壊します。
マイケルハートル16

私が言う$(ps -eo comm,pid,etimes | awk '/^procname/ {if ($3 > 300) { print "kill "$2}}')少し滑らかであるが、答えは素晴らしいとにかくです
Yevgen

@WhiteHatは、特定のpidを持つプロセスに対して、同じことをどのように行いますか?
ペタルVasilevの

私の時間を無駄にしたことの1つは、「with awk NOT」を使用する必要があることです
-cn123h

6

crontabでこのような長期実行コマンドを実行することはできますか?

timeout -k 300 command

5

キルスクリプトの私のバージョン、以前の両方の回答から利益を得る:

#!/bin/bash

#Email to send report
MY_EMAIL="example@email.com"

#Process name to kill
NAME_KILL="php"

#UID to kill
UID_KILL=33.

#Time in seconds which the process is allowed to run
KILL_TIME=60

KILL_LIST=()
EMAIL_LIST=()
while read PROC_UID PROC_PID PROC_ETIMES PROC_ETIME PROC_COMM PROC_ARGS; do
    if [ $PROC_UID -eq $UID_KILL -a "$PROC_COMM" == "$NAME_KILL" -a $PROC_ETIMES -gt $KILL_TIME ]; then
    KILL_LIST+=("$PROC_PID");
    MSG="Killing '$PROC_ARGS' which runs for $PROC_ETIME";
    EMAIL_LIST+=("$MSG");
    echo "$MSG";
    fi
done < <(ps eaxo uid,pid,etimes,etime,comm,args | tail -n+2)
if [ ${#KILL_LIST[*]} -gt 0 ]; then
    kill -9 ${KILL_LIST[@]}
    printf '%s\n' "${EMAIL_LIST[@]}" | mail -s "Long running processes killed" $MY_EMAIL
fi

UID、NAMEでプロセスをフィルタリングし、実行時間が制限を超えた場合-プロセスを強制終了し、レポートを電子メールに送信します。その電子メールが必要ない場合は、最後の行にコメントするだけです。


2

このページで解決策を見つけました:http : //www.directadmin.com/forum/showthread.php?t=26179

空のファイルを作成し、killlongproc.shと呼びます

これをコピー:

#!/bin/bash
# This script will kill process which running more than X hours
# egrep: the selected process; grep: hours
PIDS="`ps eaxo bsdtime,pid,comm | egrep "spamd|exim|mysqld|httpd" | grep " 1:" | awk '{print $2}'`"

# Kill the process
echo "Killing spamd, exim, mysqld and httpd processes running more than one hour..."
for i in ${PIDS}; do { echo "Killing $i"; kill -9 $i; }; done;

あなたのcronジョブでこれを止めてください

15 * * * * * root /{directory}/./killongproc.sh

4
通常、これを行うのは悪い考えです。どのような問題を本当に解決しようとしていますか?また、kill -9終了する前にプロセスが適切なクリーンアップを行う機会を与えないため、使用しないでください。
追って通知があるまで一時停止します。

1
これは、ある程度のリアルタイム(1時間前に開始されるなど)で実行されているプロセスではなく、ある程度のCPU時間(ユーザー+システム)を消費したプロセスを強制終了します。
Marki555 14年

2

スクリプトがあり、ここであなたがやりたいことを修正することができます。

編集は以下のスクリプトを追加しました

#!/bin/bash
#
#Put the UID to kill on the next line
UID_KILL=1001

#Put the time in seconds which the process is allowed to run below
KILL_TIME=300

KILL_LIST=`{
ps -eo uid,pid,lstart | tail -n+2 |
    while read PROC_UID PROC_PID PROC_LSTART; do
        SECONDS=$[$(date +%s) - $(date -d"$PROC_LSTART" +%s)]
        if [ $PROC_UID -eq $UID_KILL -a $SECONDS -gt $KILL_TIME ]; then
        echo -n "$PROC_PID "
        fi
     done 
}`

if [[ -n $KILL_LIST ]]
then
        kill $KILL_LIST
fi

それを修正するのに十分な知識がありません、だから私はあなたに尋ねる理由です

2
複雑すぎる。列etimesを使用してps、プロセス開始からの経過秒数を直接表示できます(開始時間から計算する必要はありません)。
Marki555 14年

@ Marki555はい、これは本当です。ただし、バージョンのあるシステムではpsそのサポートされていないetimes(のみetime)は、これは優れた代替手段です。一番上の回答からエラーが出たときに使用しましたps
マイク

0

同様のタスクを解決する必要がありましたが、スクリプトは必要ありません。実行可能ファイル "THECOMMAND"のプロセスを終了する(SIGTERMシグナル):

killall -u $USER --older-than 5m THECOMMAND

現在のユーザーに対する制限-u $USERは、他のユーザーも「THECOMMAND」を実行する場合に不必要なエラーメッセージを回避するためにのみ必要です。独自のユーザーcrontabで、次を入力します。

*/5 * * * *     killall -u $USER --older-than 5m THECOMMAND

システムcrontab(ユーザー「root」)で、次を追加します。

*/5 * * * *     killall --older-than 5m THECOMMAND

プロセスを終了(SIGTERM)する代わりにプロセスを強制終了(SIGKILL)する場合--signal SIGKILLは、パラメーターに追加して明示的にSIGKILLシグナルを送信します。システムcrontabの例:

*/5 * * * *     killall --older-than 5m --signal SIGKILL THECOMMAND

-4

httpdの場合

ps eaxo pid、time、comm | テール-n + 2 | grep 'httpd' | awk 'substr($ 0,9,1)> 0' | awk '{print $ 1}'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.