在Debian 4.9上,我基于以下模板定义了自定义python3.5服务(守护程序):https://gist.github.com/josephernest/77fdb0012b72ebdf4c9d19d6256a1119
TestDaemon.py:
import sys, pdaemon, time
import MyLogger
logger = None
class TestDaemon(pdaemon.Daemon):
def printversion(self):
logger.info("You are using Python {}.{}.".format(sys.version_info.major, sys.version_info.minor))
def run(self):
self.printversion()
logger.info("Runfake BEGIN")
for i in range(10):
logger.info("loop #{0}...".format(i))
time.sleep(1)
logger.info("Runfake END")
def quit(self):
logger.info("TestDaemon-quit")
time.sleep(1)
if __name__ == '__main__':
logger = MyLogger.MyLogger.getDaemonLog()
i = 0
for a in sys.argv:
print("args[{0}]: {1}".format(i, a))
i += 1
if len(sys.argv) < 2:
print("Usage: {0} start|stop|restart".format(sys.argv[0]))
sys.exit(2)
daemon = TestDaemon('/var/run/TestDaemon.pid')
if 'start' == sys.argv[1] or '--start' == sys.argv[1]:
daemon.start()
elif 'stop' == sys.argv[1] or '--stop' == sys.argv[1]:
daemon.stop()
elif 'restart' == sys.argv[1] or '--restart' == sys.argv[1]:
daemon.restart()
else:
print("Unknown command '{0}'".format(sys.argv[1]))
sys.exit(2)
/etc/systemd/system/mytest.service:
[Unit]
Description=MyTest service
[Service]
Type=forking
ExecStart=/bin/sh -c "/usr/bin/python3 /usr/share/mytest/TestDaemon.py start"
ExecStop=/bin/sh -c "/usr/bin/python3 /usr/share/mytest/TestDaemon.py stop"
ExecReload=/bin/sh -c "/usr/bin/python3 /usr/share/mytest/TestDaemon.py restart"
# Disable Python's buffering of STDOUT and STDERR, so that output from the
# service shows up immediately in systemd's logs
Environment=PYTHONUNBUFFERED=1
# Automatically restart the service if it crashes
Restart=no
# Our service will notify systemd once it is up and running
#Type=notify
# Use a dedicated user to run our service
User=mytest
Group=mytest
[Install]
# Tell systemd to automatically start this service when the system boots
# (assuming the service is enabled)
WantedBy=default.target
运行部分最多循环10次是正常的。我想先尝试一下,直到达到10,因为该过程在第一次迭代或有时是第二次迭代之后都会停止...
服务日志的输出:
2020-09-17 11:51:15,078 : INFO : My daemon: start
2020-09-17 11:51:15,107 : INFO : You are using Python 3.5.
2020-09-17 11:51:15,108 : INFO : Runfake BEGIN
2020-09-17 11:51:15,108 : INFO : loop #0...
2020-09-17 11:51:15,152 : INFO : My daemon: stop
2020-09-17 11:51:15,153 : INFO : TestDaemon-quit
2020-09-17 11:51:15,353 : INFO : My daemon: stopped
daemon.log的输出:
Sep 17 11:51:15 vps817262 systemd[1]: Starting MyTest service...
Sep 17 11:51:15 vps817262 sh[29354]: args[0]: /usr/share/mytest/TestDaemon.py
Sep 17 11:51:15 vps817262 sh[29354]: args[1]: start
Sep 17 11:51:15 vps817262 systemd[1]: Started MyTest service.
Sep 17 11:51:15 vps817262 sh[29361]: args[0]: /usr/share/mytest/TestDaemon.py
Sep 17 11:51:15 vps817262 sh[29361]: args[1]: stop
journalctl -xe的输出:
sept. 17 11:51:15 vps817262 sudo[29349]: hypgnosis : TTY=pts/2 ; PWD=/home/hypgnosis ; USER=root ; COMMAND=/bin/systemctl start mytest
sept. 17 11:51:15 vps817262 sudo[29349]: pam_unix(sudo:session): session opened for user root by hypgnosis(uid=0)
sept. 17 11:51:15 vps817262 systemd[1]: Starting MyTest service...
-- Subject: L'unité (unit) mytest.service a commencé à démarrer
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- L'unité (unit) mytest.service a commencé à démarrer.
sept. 17 11:51:15 vps817262 sh[29354]: args[0]: /usr/share/mytest/TestDaemon.py
sept. 17 11:51:15 vps817262 sh[29354]: args[1]: start
sept. 17 11:51:15 vps817262 systemd[1]: Started MyTest service.
-- Subject: L'unité (unit) mytest.service a terminé son démarrage
-- Defined-By: systemd
-- Support: https://www.debian.org/support
--
-- L'unité (unit) mytest.service a terminé son démarrage, avec le résultat done.
sept. 17 11:51:15 vps817262 sudo[29349]: pam_unix(sudo:session): session closed for user root
sept. 17 11:51:15 vps817262 sh[29361]: args[0]: /usr/share/mytest/TestDaemon.py
sept. 17 11:51:15 vps817262 sh[29361]: args[1]: stop
所以现在我真正的问题是:为什么调用守护程序的“ stop”命令在成功启动后立即将其停止?
它是从sudo会话启动后关闭的吗?
我当时真的很困:不知道谁叫这个停站...:(
感谢大家的帮助
致谢
误诊