저는 이 간단한 Python 스크립트를 보호하고 싶습니다.
#!/usr/bin/python3
print('hello')
이것은 내 명령과 상태입니다.
root@gw-0317STLG0067 /lib/systemd/system # systemctl enable test.service
root@gw-0317STLG0067 /lib/systemd/system # systemctl daemon-reload
root@gw-0317STLG0067 /lib/systemd/system # systemctl start test.service
root@gw-0317STLG0067 /lib/systemd/system # systemctl status test.service
* test.service - My Script Service
Loaded: loaded (/usr/lib/systemd/system/test.service; enabled; vendor preset:
Active: inactive (dead) since Sun 2016-07-31 10:06:29 UTC; 4s ago
Process: 20620 ExecStart=/root/test.py (code=exited, status=0/SUCCESS)
Main PID: 20620 (code=exited, status=0/SUCCESS)
Jul 31 10:06:29 gw-0317STLG0067 systemd[1]: Started My Script Service.
Jul 31 10:06:29 gw-0317STLG0067 test.py[20620]: hello
이것은 내 서비스 스크립트입니다.
[Unit]
Description=My Script Service
After=multi-user.target
[Service]
Type=simple
ExecStart = /root/test.py
[Install]
WantedBy=multi-user.target
왜 죽었고 인쇄된 명세서를 보호할 때 정확히 무슨 일이 일어나야 합니까? 터미널을 폭파시켜야 할까요?
답변1
스크립트는 일반적으로 서비스로 시작하고 매우 빠르게 종료됩니다(명령이 하나뿐이고 while 루프나 재실행과 유사한 루프가 없기 때문에). 서비스가 훨씬 빠르게 종료되고 상태를 요청할 수 있습니다. 활성 상태를 확인하려면 몇 가지 루프(로그를 스팸하지 않도록 시간 초과 포함)를 추가해 보세요.
while True:
print('hello')
time.sleep(2)
journalctl -u test.service
충분한 내용을 확인하면 systemctl을 통해 해당 내용을 종료하세요.
답변2
스크립트가 엔드포인트에 도달하고 종료되기 때문에 죽었습니다. 왜 한 print
문장이 터미널을 폭파시키는 걸까요? 데몬은 일반적으로 루프에서 실행되어 종료할 시간인지 확인하고 그렇다면 종료합니다(또는 커널에서 신호를 포착하면).
답변3
Python 스크립트는 "hello world"를 인쇄한 후 Python이 스크립트 끝에 도달했음을 인식하고 실행을 종료합니다.
systemd에서 무엇을 하길 원하시나요?
다음과 같은 간단한 sh 스크립트를 사용해 보십시오.
#!/bin/sh touch /tmp/myfile$$.txt echo /tmp/myfile$$.txt tail -f /tmp/myfile$$.txt
<file>
서비스 상태에서 얻을 수 있는 이름입니다.
그런 다음 터미널에서 텍스트를 스트리밍하고 echo "Hello World" >> <file>
서비스를 확인하세요.
반복적으로 반복하고 인쇄하는 서비스가 터미널을 가득 채울 것입니다... 여기에서 파일을 읽고 필요한 경우 자유롭게 텍스트를 공급할 수 있습니다. 서비스가 시작될 때마다 PID인 새 파일이 생성됩니다 $$
. 다음으로, /tmp/myfile$$.txt
서비스를 중지할 때 이 파일을 삭제하세요.
연습을 위한 키워드: trap
방법입니다 ;-)
간단하게 유지하고 학습한 다음 추가하세요. Python은 신호에도 반응할 수 있습니다. 초보자에게 더 쉽기 때문에 sh를 선택했습니다...