2時間以上実行され、名前が定義されているプロセスを一覧表示する方法。私が試したことは次のとおりです。
ps -efo pid,comm,etime | grep 'process name' | awk '{print $3}'
これはソラリス用です。
または、プロセスが2時間以上実行されている場合は、プロセスIDを含む電子メールを送信するスクリプトを作成する方法を誰かが助けることができますか?
答え1
2時間以上実行されたプロセスを見つける1つのライナー
ps -e -o pid,etimes,command | awk '{if($2>7200) print $0}'
説明する:
ps
:スナップショットコマンドの処理
-e
: すべてのプロセスを一覧表示
-o
:指定された列のみを含みます。
pid
: プロセス番号
etimes
:プロセスが開始されてから経過した時間(秒単位)。
command
: コマンドとすべての引数を文字列として
awk
: パターンスキャンと処理言語
$2
:各行の2番目のトークン(デフォルトの区切り文字はスペースの数に制限なし)
7200
:7200秒= 2時間
$0
: awkのフルライン
awk構造の基本的な作業は pattern { action }
現在行を印刷することであるため、次のように短縮できます。
ps -e -o pid,etimes,command | awk '$2 > 7200'
もっと:
man ps
man awk
答え2
数年前に私が書いた記事があります。これは、progname変数にリストされているアプリケーション名を見つけ、Killtime変数の値(秒単位)より古い場合に終了します。 ps -o commから返されたプロセス名と一致するようにprognameを変更する必要があります。また、必要な時間(秒)に一致するようにkilltimeの値を変更する必要があります。 cronjobでトリガされ、定期的に確認できます。
実行する前に、これらすべての機能が何であるかを確認してください。そうしないと、予期しないプロセスが終了する可能性があります。
これはRHEL 7.xで動作するため、Solarisほど楽観的ではありませんが、非常に似ているため、調整はほとんどまたはまったくありません。フォーマットエラーがございましたらお詫び申し上げます。クリーンアップする必要があるいくつかの残りの形式の混乱があります。
###With email send on process kill
#!/bin/bash ############################################################################## # Name: checkRunawaProgram.sh
# Version: 1.0
# Date: 10/07/2015
# Author: Mark S
# Description: check processes for a named command and if older than a specified time in seconds kill the process.
#Note about time: If killtime is over 60 seconds it will be off by 40 seconds.
# Example: ./checkRunawaProgram.sh fire off from cronjob or run manually
#NOTE: adjust the progname and killtime fields for your file and delay time.
# and adjust email address to your addr.
#EDITED By-On-Why
#Mark-10/08/15-Clean up and add variables progname and killtime
#Mark-10/9/15 Add email and logger
#
##############################################################################
progname=runawaProgram.sh
killtime=50
ps -o uname,pid,etime,comm -C $progname \
| while read user pid elapsed comm
do
echo etime $elapsed
echo pid $pid
#Strip off : from elapsed and store in elapsed1
elapsed1=${elapsed//[:]/}
echo elapsed1 $elapsed1
if [ ${elapsed1} -gt ${killtime} ]
then
echo greater than 10 on pid $pid
echo killing pid $pid
kill $pid ## ##email Variables
now=`date`
subject="es-ppscnftp01 cron killing process $pid"
varHost=`hostname`
sendTo="[email protected]"
mail -s "$subject" "$sendTo" << END_MAIL
From $varHost
The process ID $pid was killed
the process name was $comm
END_MAIL
#send info to /var/log/messages
logger The cronjob checkRunawaProgram.sh killed the $pid process for Process name $comm
fi
done