X분보다 오래된 명명된 프로세스를 종료하시겠습니까? (killall -o 제외)

X분보다 오래된 명명된 프로세스를 종료하시겠습니까? (killall -o 제외)

좋아, 첫 번째 포스팅! 그래서 특정 프로세스 이름으로 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

관련 정보