2시간 이상 실행되었으며 이름이 정의된 프로세스를 나열하는 방법입니다. 내가 시도한 것은 다음과 같습니다.
ps -efo pid,comm,etime | grep 'process name' | awk '{print $3}'
이것은 솔라리스용입니다.
또는 프로세스가 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 변수의 값(초 단위)보다 오래된 경우 종료합니다. 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