Linux 시작 스크립트/etc/init 및 특정 사용자

Linux 시작 스크립트/etc/init 및 특정 사용자

/etc/init/mms-agent.conf에 스크립트를 만들었습니다.

start on runlevel [2345]
stop on runlevel [06]

exec /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1

MMS 프록시 시작/중지 서비스가 제대로 작동하지만 "MMS" 사용자로 이 서비스를 시작하고 싶습니다.

다음과 같이 스크립트를 변경하려고 하면:

exec su mms -c "/usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1"

예상되는 1개(su, bash + 내 Python 스크립트) 대신 3개의 프로세스가 실행되고 있습니다.

mms       8864  0.0  0.2  37816  1332 ?        Ss   22:30   0:00 su mms -c /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1
mms       8865  0.0  0.2  11452  1196 ?        S    22:30   0:00 bash -c /usr/bin/env python /home/mms/mms-agent/agent.py >> /home/mms/agent.log 2>&1
mms       8866  4.0  1.8  54672 10640 ?        Sl   22:30   0:00 python /home/mms/mms-agent/agent.py

그게 무슨 뜻이야?

루트가 아닌 사용자로 스크립트를 시작하는 가장 좋은 방법은 무엇입니까?

감사해요

첨부된:

exec start-stop-daemon --start -u mms --exec "/usr/bin/env python /home/mms/mms-agent/agent.py"

작동하지 않습니다. 오류가 발생하지 않지만 프로세스가 아직 시작되지 않았습니다.

답변1

바라보다다른 사용자로 작업 실행Upstart 매뉴얼에 있습니다. 사용하는 start-stop-daemon것이 권장되는 방법입니다.

방금 작은 실수를 했습니다. start-stop-daemon실행 파일의 경로가 필요한 전체 명령줄을 전달했습니다. 매개변수를 별도로 전달합니다.

호출의 또 다른 문제는 start-stop-daemon모든 Python 프로세스를 서비스의 인스턴스로 간주하도록 지시한다는 것입니다. 이로 인해 관련되지 않은 다른 Python 프로세스가 종료될 수 있습니다. 서비스가 하나의 인스턴스만 실행하도록 하려면 pidfile을 사용하십시오.

exec start-stop-daemon --start -c mms -u mms -m -p /var/run/mms-agent.pid \
                       --startas /usr/bin/env -- python /home/mms/mms-agent/agent.py

답변2

exec를 실행하면 su쉘이 프로세스로 대체됩니다 su. su그런 다음 포크와 execs bash. bash출력 리디렉션을 설정한 다음 분기 및 실행을 설정합니다 env. envPATH를 검색하여 찾아서 python실행하세요. 따라서 1) 종료를 su기다리는 프로세스 bash, 2) (이전 ) 종료를 bash기다리는 프로세스 , 3) 스크립트를 실행 중입니다.pythonenvpython

아무 문제가 없습니다. su임시로 사용자를 전환하는 유서 깊은 Unix 방법이므로 이 방법을 사용해야 합니다. 다시 말하지만, 명령줄을 실행하는 방법은 셸을 사용하는 것이므로 su실행 bash하고 알아서 bash처리되도록 하세요. 다시 말하지만, 이는 다른 응용 프로그램에서 셸 명령줄과 PATH 검색 기능을 다시 개발하는 대신 셸이 자신의 능력에 맞는 작업을 수행하도록 하는 일반적인 Unix 도구 상자 접근 방식을 따릅니다.

또한 bash이미 PATH 검색이 이루어졌기 때문에 포기 env하고 직접 호출 하셔도 됩니다 python.

답변3

Python 프로세스를 실행하기 위해 쉘을 시작하는 su를 실행하고 있기 때문에 세 개의 프로세스가 생성됩니다.

"추가" 두 프로세스가 종료할 수 있다고 믿게 만드는 다양한 방법이 있습니다. 예를 들어 Python 스크립트 포크 및 exec를 사용하거나 su 배경을 사용하여 명령 자체를 실행할 수 있습니다.

관련 정보