![systemd를 사용하여 Python 스크립트를 서비스로 실행해 보세요.](https://linux55.com/image/111303/systemd%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20Python%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EB%A5%BC%20%EC%84%9C%EB%B9%84%EC%8A%A4%EB%A1%9C%20%EC%8B%A4%ED%96%89%ED%95%B4%20%EB%B3%B4%EC%84%B8%EC%9A%94..png)
방금 데비안 8 VPS를 받았고 Python 스크립트를 서비스로 실행하려고 합니다. 다음과 같이 썼습니다(모든 작업은 루트로 로그인한 SSH를 통해 수행됩니다).
[Unit]
Description=My Script Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1
[Install]
WantedBy=multi-user.target
나는 그것을 넣은 /lib/systemd/system
다음 chmoded했습니다.
chmod 644 /lib/systemd/system/cmcreader.service
그런 다음 다음을 사용하여 활성화하려고 합니다.
systemctl daemon-reload
systemctl enable cmcreader.service
그러나 마지막 명령은 ( enable
)를 반환합니다.
Failed to execute operation: Invalid argument
내가 뭘 잘못했나요? 감사해요.
답변1
여기에서 man systemd.directives
모든 systemd 지시어에 대한 문서를 찾을 수 있습니다. 여기서 ExecStart=
문서의 내용을 찾을 수 있습니다 man systemd.service
.
거기 문서에는 다음과 같이 나와 있습니다.
"<", "<<", "">" 및 ">>"를 사용한 리디렉션, "|"를 사용한 파이프, "&"를 사용한 백그라운드에서 프로그램 실행 및 기타 셸 구문 요소는 지원되지 않습니다.
일반적으로 필요하지도 않습니다. systemd
애플리케이션은 기본적으로 이미 백그라운드에서 실행되므로 그럴 필요가 없습니다 &
. 또한 출력을 자동으로 STDOUT 및 STDERR로 캡처하고 기록하므로 출력을 로그 파일로 리디렉션할 필요도 없습니다.
journalctl -u cmcreader
서비스에 대한 로그를 보거나 journalctl
모든 로그를 보는 데 에만 사용하십시오 .
시스템 파일의 구문이 확실하지 않은 경우 다음을 사용할 수 있습니다.
systemd-analyze verify ./path/to/your.service
또한 생성한 서비스 파일도 /etc/systemd/system
. 이 /lib
디렉터리는 수동이 아닌 패키지로 설치된 서비스 파일을 저장하는 데 사용됩니다.
마지막으로 enable
서비스를 시작하는 대신 [Install]
부팅 시 애플리케이션이 시작되도록 설정하는 부분만 실행합니다.
서비스를 시작하려면 를 사용하십시오 systemctl start your.service
.
답변2
문제는 쉘 리디렉션 연산자를 사용하려고 한다는 것입니다. systemd는 쉘에서 ExecStart 라인을 암시적으로 실행하지 않습니다.
그것이 하는 일은 사용자가 지정한 프로그램( /usr/bin/python
예제에서는)을 실행하는 것 뿐이며, 그 밖의 모든 것은 해당 프로그램에 대한 매개변수입니다. > /web/cmcreader/test.log 2>&1
섹션 으로 인해 잘못된 인수 오류가 발생합니다.예Python에 대한 인수가 잘못되었습니다.
@mark-stosberg의 답변에 따라 단순히 Journalctl을 사용하고 리디렉션의 모든 항목을 제거하는 것이 좋습니다.진짜Python 스크립트를 파일에 쓰려면 다음과 같은 몇 가지 옵션이 있습니다.
- 실제로 로그 파일에 쓰도록 Python을 다시 작성하십시오.
- Python 스크립트를 실행하고 출력을 리디렉션하는 bash 스크립트를 시스템에서 실행했습니다.
- systemd가 bash를 명시적으로 실행하도록 허용
ExecStart=bash -c "/usr/bin/python /web/cmcreader/test.py > /web/cmcreader/test.log 2>&1"
다시 한번 말하지만, 저는 이러한 옵션을 별로 추천하지 않습니다. 특히 마지막 옵션은 더욱 그렇습니다.