사용자가 로그인할 때 아직 실행되지 않은 명령을 실행하는 방법

사용자가 로그인할 때 아직 실행되지 않은 명령을 실행하는 방법

SSH를 통해 헤드리스 서버에 연결할 때 일련의 불쌍한 데몬을 실행하는 경우가 많습니다. 도착내 술통 안의 맥주를 모니터링해헤이 도착웹 브라우저에서 서버 자체를 모니터링.

나는 다음에서 둘 다 실행하여 이 작업을 수행합니다 screen.

screen -d -m psdash
screen -d -m kegbot runserver xxx.xx.x.xxx:8008

화면 밖의 이 두 명령은 세션의 나머지 부분을 사용할 수 없게 stdout만드는 방식으로 지배적인 경향이 있습니다. ssh또한 session 으로 종료되므로 sshscreen 이 최선의 선택이라고 생각합니다.

내 질문은: 로그인 시 이러한 명령을 실행하는 방법이나 다른 방법이 있습니까? .profile하지만 이미 실행 중인 경우에는 그렇지 않습니까? 그 마지막 부분은 나를 피합니다.

답변1

시작하는 두 프로세스( 및 ) $!모두에 대한 파일에 PID(프로세스 시작 후 bash에서)를 작성하는 것이 좋습니다 .psdashkegbot

그런 다음 이를 사용하여 ps --pid $(cat your.pid) | tr -s ' ' | sed 1d | cur -d' ' -f4프로세스가 실제로 실행 중인지 확인할 수 있습니다.

.pid그런데, 파일을 작업하기 전에 파일 내부의 PID가 유효한지 항상 확인해야 합니다!

프로그램이 중지되면 파일 .pid(보통 프로그램 자체의 일부 또는 쉘스크립트 래퍼)을 삭제하는 데 사용하는 메커니즘이 무엇이든 파일의 "잘못된" PID로 인해 실패할 가능성이 높습니다 .pid. 재부팅 후에도 파일이 지속 되면 .pid최악의 시나리오는 작업을 수행하려는 다른 프로세스의 PID가 될 것입니다.


kegbot좋습니다 . 예 를 들어 가능한 해결책은 다음과 같습니다 .

먼저 래퍼 스크립트가 필요합니다. 단순화를 위해 $HOME.

따라서 간단한 래퍼( run_kegbot.sh)는 다음과 같습니다.

#!/bin/zsh
kegbot runserver xxx.xx.x.xxx:8008
echo $! > kegbot.pid
wait
rm -rf kegbot.pid

kegbot이것은 백그라운드로 포크하는 등 의 경우에 대한 해결책이지만 포크 후에 PID가 유효한 경우입니다. kegbotPID 파일을 직접 처리할 수 있으면 PID 파일을 직접 처리하는 수고를 덜 수 있을지 모르겠습니다 . 또는 kegbot배경으로 분기하고 셸 자체를 사용하여( &라인 2 끝에 a를 추가하여) PID 파일에 쓰고 완료될 때까지 기다릴 수 없습니다.

어쨌든 PID 파일 Malarkey를 완성한 후에는 다음을 추가해야 합니다 .profile.

[ -e kegbot.pid ] && {
    PID=$(cat kegbot.pid)
    COMM=$(ps -p $PID -o comm=)
    [ "x$COMM" != "xkegbot" ] && rm -f kegbot.pid 
}

[ -e kegbot.pid ] || screen -d -m ./run_kegbot.sh

다시 말하지만 이것은 단지하나문제에 대한 해결책이지만 일반적인 아이디어는 프로세스의 PID를 사용하여 실행 중인지 확인하는 것입니다. 위의 방법은 이를 수행하는 한 가지 방법입니다.

일부 데몬은 PID 파일을 저장하거나 /var/run/이를 수행 kegbot합니다. psdash이러한 PID 파일을 직접 사용할 수 있으므로 래퍼 스크립트 등이 필요하지 않습니다.

PID 파일의 PID가 실제로 그것이 속한 프로세스인지 반드시 확인해야 합니다. 악성 재부팅 및/또는 데몬 충돌로 인해 좀비화된 PID 파일 등이 남을 수 있습니다. 위의 PID 파일에 대한 첫 번째 테스트의 목적은 다음과 같습니다.

관련 정보