사용자가 정의한 조건에 따라 여러 프로세스를 지속적으로 제어하는 ​​방법

사용자가 정의한 조건에 따라 여러 프로세스를 지속적으로 제어하는 ​​방법

내 질문에는 두 가지 프로그램(kodi 및 xscreensaver)이 관련되어 있습니다. 다른 앱에서도 이런 상황이 발생했으므로 더 일반적으로 App1과 App2라는 두 개의 앱이 있다고 말씀드리겠습니다. App2를 시작부터 종료까지 지속적으로 실행하고 싶지만 내 컴퓨터 옆에서 App1을 자주 사용합니다. 때로는 떠날 때 App1을 닫는 것을 잊어버릴 때도 있습니다. App1이 실행되고 있지 않으면 App2가 기본 설정으로 실행되기를 원합니다. App1이 실행 중인 경우 App2가 해당 동작을 변경하기를 원하지만 App1이 오랫동안(예: 1시간 30분) 실행된 경우 App2는 일반 설정으로 돌아가야 합니다.

나는 bash 스크립트와 cron 또는 start-stop-daemon과 같은 다른 것을 사용하여 이 작업을 수행할 수 있다고 생각합니다. 지금까지 bash에서 Action_Needed.sh라는 파일에서 수행한 작업은 다음과 같습니다.

    #!/bin/bash
    # Determine if App1 and App2 are running at the same time
    # Exit with 0 if yes, Exit with 1 if not

    ps -e | grep -q "App1"
    if [ $? -eq 0 ]
    then
        # App2 should always be running, but check
        # anyway.  This could potentially be used
        # to restart App2 automatically, if for some
        # reason it was closed or crashed.
        ps -e | grep -q "App2"
        if [ $? -eq 0 ]
        then
            return 0
        else
            return 1
    fi
    else
        return 1
    fi

간단히 말해서 Cron과 함께 이 스크립트를 사용하여 매분마다 실행하고 위 스크립트가 상태 0으로 종료될 때 App2의 동작을 변경할 수 있습니다.

App1이 오랫동안 실행되고 있고(예: 한 시간 반) App2가 정상적으로 계속 실행되도록 하려면 어떻게 해야 합니까? Cron이 아닌 다른 것을 사용해야 합니까?

답변1

그러면 특정 이름을 가진 프로세스를 확인하고 실행 여부와 실행 기간을 기준으로 몇 가지 선택을 하고 싶으십니까?

프로세스의 프로세스 ID를 찾으려면 출력을 grep 하거나 주석에 링크된 예제 또는 이와 유사한 것을 ps사용할 수 있습니다 . 귀하의 시스템에 어떤 것이 있든 상관 없습니다. (예를 들어 Debian의 패키지 에 있습니다 .)pidofpgreppgrepprocps

당신이 원하는 또 다른 것은 대상 프로그램의 실행 시간입니다. 최신 Linux 시스템에서는 이를 사용하여 ps --no-headers -oetimes $PID프로세스가 시작된 이후의 시간을 초 단위로 가져올 수 있습니다.

따라서 다음과 같습니다.

#/bin/sh
target="App1"   
# target=$1  # uncoment to take the target from the command line
pid=$(pgrep --oldest "$target")  
if [ -n "$pid" ] ; then
    time=$(ps --no-headers -oetimes "$pid")
    echo "Oldest $target has been running for $time seconds"
    if [ "$time" -gt 5400 ] ; then
        echo "That's more than 1.5 hours"
    fi
fi 

그러나 검색 결과가 여러 프로세스와 일치하는 경우 pgrep( 및 pidof)는 여러 PID를 반환합니다. 일치 항목을 충분히 좁게 만들 거나 ( pgrep -f여기서 유용할 --newest수 있음 ) 프로그램의 PID 출력 중 하나만 사용하도록 스크립트를 수정하여 이 문제를 어떻게든 처리해야 합니다 .--oldestpgrep

답변2

고급 프로세스 제어에는 *sh를 사용하지 마십시오. 본질적으로 이는 SysVinit의 자격을 박탈합니다. 다음과 같이 보일 때까지 모든 고통스러운 엣지 케이스 실패에 대해 항상 초기화 스크립트를 패치하고 연결할 수 있습니다.언제나업무를 올바르게 수행하고 다음 작업이 올 때까지 책임을 져야 합니다.

systemd는 upstart와 마찬가지로 종속성이 있는 작업을 지원합니다. 두 가지 모두 아래와 같이 사용자 GUI를 실행하기 위한 "사용자 세션" 모드도 있습니다.

관련 정보