좋아, 첫 번째 포스팅! 그래서 특정 프로세스 이름으로 5분 이상 경과된 프로세스를 확인해야 하는 상황이 생겼습니다. 문제는 시스템이 CentOS 4의 맞춤형 빌드이므로 pmisc 21.4가 있고 killall이 22.9까지 -o/--older-than을 통합하지 않았다는 것입니다. 시스템을 업그레이드할 수 있는 옵션이 없으므로 그렇게 제안하지 마세요. 이는 외부에서 액세스할 수 없는 내부 시스템이므로 잠재적인 보안 문제는 이 고객에게 큰 문제가 되지 않습니다.
엔지니어들은 이 프로세스가 가끔 중단되는 이유를 파악하기 위해 솔루션을 연구하고 있지만 그 동안에는 스크립트를 크론하여 프로세스를 확인하고 5분 이상 실행 중이면 종료합니다. 왜냐하면 일반적으로 30~45초밖에 걸리지 않기 때문입니다. 완료합니다.
ps 출력, 일부 egrep 및 regex 구문을 사용하여 이 작업을 수행할 수 있다고 확신하지만 이를 모두 통합하는 방법을 모르겠습니다.
이 프로세스를 "동기화"라고 합니다. 누군가 나에게 다음 제안 코드를 주었지만 작동하지 않는 것 같습니다.
#!/bin/bash
for i in $(pgrep -f synch)
do
TIME=$(ps --no-headers -o etime $i | cut -d":" -f 2)
if [ "$TIME" -gt 4 ] ; then
kill $i
fi
done
답변1
-o etimes
인간 친화적인 표현 대신 초 단위로 시간을 표현해 보세요 . 그런 다음 제거 cut
하고 시간이 300초 이상인지 확인할 수 있습니다.
#!/bin/bash
for i in $(pgrep -f synch)
do
TIME=$(ps --no-headers -o etimes $i)
if [ "$TIME" -ge 300 ] ; then
kill $i
fi
done
답변2
매뉴얼 페이지에 따르면 형식은 입니다 etime
. [[DD-]hh:]mm:ss
일부 필드가 누락될 수 있기 때문에 구문 분석하기가 약간 짜증납니다.
프로세스가 짧은 기간 동안만 실행되었다고 가정하는 경우 첫 번째 필드는 분이어야 합니다. 따라서 cut -d: -f1
대신 사용해 보십시오 -f2
. 그러나 프로세스가 한동안 실행되었다면 몇 시간이 걸릴 것입니다.
( etimes
훨씬 좋겠지만 psmisc 22.2-5에도 없는 것 같아서 아마 못 쓰실 것 같습니다.)
답변3
오래된 CentOS 4에 대해 고집이 있다면 find
시도해 볼 가치가 있습니다.
find /proc -maxdepth 1 -regex '/proc/[0-9]*' -type d -mmin +5 -exec kill {} \;
답변4
C++에 신경 쓰지 않고 컴퓨터에 리소스가 충분하다면 다음과 같은 재귀 프로그램을 작성할 수 있습니다.
int main()
{
int Started;
int Passed;
RUNAGAIN:
system("time=$(date); echo $time > ~/timeStarted");
CHECKTIME:
system("passed0=$(date); echo $passed0 > ~/timePassed; passed 1=$(cut -c15,16 ~/timePassed); echo $passed1 > ~/timePassedCut; started0=$(cut -c15,16 ~/timeStarted; echo $started0 > ~/timeStartedCut");
ifstream STARTED("~/timeStartedCut");
STARTED>>Started;
STARTED.close();
ifstream PASSED("~/timePassedCut");
PASSED>>Passed;
PASSED.close();
int TimePassed
TimePassed = Started - Passed;
if(TimePassed>4)
{
system("killall *process name here*; ~/*process name here*//to start it again, omit if uneeded//");
goto RUNAGAIN;
}
else if(TimePassed<5)
{
goto CHECKTIME;
}
}
프로그램이 시작된 날짜를 추출하고, 시간에서 분을 잘라내고, 파일에 쓰고, 파일을 변수로 로드하고, 일정 시간이 지난 후 동일한 작업을 수행하고 시작 시간(분) 간의 차이가 계산되면 시간을 확인하시고, 5분 이상이면 프로세스가 종료됩니다. 프로세스와 타이머가 동시에 시작되도록 하려면 다음이 포함된 기본 셸 스크립트를 사용하여 관련 프로세스를 시작하세요.
#!/bin/sh
~/*process name here* & ~/CheckTime