如何列出已运行超过 2 小时且已定义名称的进程。这是我尝试过的。
ps -efo pid,comm,etime | grep 'process name' | awk '{print $3}'
这是针对 Solaris 的。
或者有人可以帮助如何创建一个脚本,如果进程运行时间超过 2 小时,该脚本将发送包含进程 ID 的电子邮件。
答案1
一个查找已运行超过 2 小时的进程的班轮
ps -e -o pid,etimes,command | awk '{if($2>7200) print $0}'
解释:
ps
:处理快照命令
-e
:列出所有进程
-o
:仅包含指定的列
pid
: 进程号
etimes
:自进程启动以来经过的时间,以秒为单位
command
:命令及其所有参数作为字符串
awk
:模式扫描和处理语言
$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 变量中的值(以秒为单位),则会终止它。您必须更改 progname 以匹配 ps -o comm 返回的进程名称。您还必须更改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