Linux-自定​​义服务在启动后立即停止

时间:2020-09-17 10:14:36

标签: python linux service daemon systemd

在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会话启动后关闭的吗?

我当时真的很困:不知道谁叫这个停站...:(

感谢大家的帮助

致谢

误诊

0 个答案:

没有答案