![为什么 systemd 启动后立即停止服务?](https://linux22.com/image/1479445/%E4%B8%BA%E4%BB%80%E4%B9%88%20systemd%20%E5%90%AF%E5%8A%A8%E5%90%8E%E7%AB%8B%E5%8D%B3%E5%81%9C%E6%AD%A2%E6%9C%8D%E5%8A%A1%EF%BC%9F.png)
我创建了一个 systemd 服务,它在启动或重启时应该调用一个 shell 脚本。
[Unit]
Description=Starts the DCCA index software
[Install]
WantedBy=multi-user.target
[Service]
ExecStart=/opt/insiteone/bin/indexControl start
ExecStop=/opt/insiteone/bin/indexControl stop
# Execute pre and post scripts as root
#PermissionsStartOnly=true
Restart=on-abort
TimeoutSec=600
最初,它在启动后就会不断无限循环地重新启动,但是当我添加该选项时,它会在服务第一次启动时立即TimeoutSec
调用(启动,然后立即再次停止)。ExecStop
有任何线索吗?我哪里错了?
附言:indexControl
是一个 shell 脚本,用于启动其他进程
答案1
你没有告诉 systemd 这是什么样的守护进程,以及对它的期望是什么(最重要的是,它需要知道守护进程何时最终开始)。
默认值为Type=simple
,这意味着第一的进程被视为主服务进程。它启动时,整个服务被视为“活动(已启动)”;它退出时,整个服务停止。
另一种常见模式是Type=forking
,初始进程预计至少分叉一次并退出,留下一个子进程“在后台”运行或“守护进程”,有些人这样称呼它。
但如果你使用“whateverctl”工具,你总是去看看需要的行为Type=forking
,因为该工具本身将尝试“在后台”启动守护进程并自行退出。
答案2
以上以及类似的答案对我都不起作用。但是这个帖子最终做到了。
[Unit]
Description=Setup foo
#After=network.target
[Service]
Type=oneshot
ExecStart=/opt/foo/setup-foo.sh
RemainAfterExit=true
ExecStop=/opt/foo/teardown-foo.sh
StandardOutput=journal
[Install]
WantedBy=multi-user.target
诀窍是RemainAfterExit=true
指令。那是因为我的脚本没有留下任何痕迹供systemd
查看,所以下一步systemd
总是调用ExecStop
来停止“这个不留下守护进程的奇怪脚本”。虽然没有实际意义,但确实如此。
更新 20180316:好吧,systemd
这几个月我完全忘记了有关服务的一切,所以我从头开始重新做所有工作。幸运的是,我隐约记得这个答案,花了半个小时寻找它,现在我又回到了这里。
我将尝试添加这次我重新学到的几件事:systemd
脚本不能放在 中/etc/init
,它们会留在更丑陋的/etc/systemd/system
目录中,而且它们被称为.service
,而不是.conf
!
脚本位于正确目录中后,sudo systemctl daemon-reload
可以使用,但不会使脚本名称出现在sudo service [TAB]
自动完成列表中。不过,可以使用以下命令启动新服务:
sudo service myservice start
就是这样,现在服务正在执行已编写的程序。当然,调用的脚本不会,但这是另一个问题。
答案3
如果您的启动服务/应用程序正在维护任何 pid,请保留 Type=forking 并提供 pid 文件位置。
[单元]
描述=“启动时运行应用程序”
After=network.target syslog.target auditd.service
[服务]
类型=forking
PIDFile=/var/run/apache2/apache2.pid
ExecStart=/etc/init.d/apache2 start
ExecStop=/etc/init.d/apache2 stop
StandardOutput=syslog
StandardError=syslog
Restart=on-failure
SyslogIdentifier=webappslog
[安装]
WantedBy=multi-user.target
别名=webapps