为什么systemd启动后立即停止服务?

Raj*_*pui 17 linux systemd

我创建了一个 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
Run Code Online (Sandbox Code Playgroud)

最初它一启动就一直在无限循环中重新启动,但是当我添加该TimeoutSec选项时,它会ExecStop在服务第一次启动时立即调用(启动,然后立即停止)。

任何线索,我哪里出错了?

PSindexControl是一个shell脚本,用来启动其他进程

Avi*_*vio 11

以上和类似的 SO 答案都不适合我。但这篇文章最终做到了。

[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
Run Code Online (Sandbox Code Playgroud)

诀窍是RemainAfterExit=true指令。那是因为我的脚本没有留下任何可供systemd查看的痕迹,所以下一步systemd总是调用ExecStop停止“这个不留下守护进程的奇怪脚本”。没有实际意义但真实。

更新 20180316:好的,systemd这几个月我完全忘记了关于服务的一切,所以我从头开始重新做所有的工作。幸运的是,我依稀记得这个答案,找了半个小时,现在我又来了。

我会尝试添加只是一对夫妇的事情我已经重新认识到这时间:systemd脚本不能放置在/etc/init,他们留在可怕的多/etc/systemd/system目录,他们是所谓的.service,不.conf

脚本在正确的目录中后, asudo systemctl daemon-reload是可取的,但不会使脚本名称出现在sudo service [TAB]自动完成列表中。尽管如此,新服务可以通过以下方式启动:

sudo service myservice start
Run Code Online (Sandbox Code Playgroud)

就是这样,现在该服务正在执行所写的内容。当然被调用的脚本不会,但这是另一个问题。


use*_*686 8

您没有告诉 systemd 这是什么类型的守护进程以及对它的期望(最重要的是,它需要知道守护进程何时最终启动)。

默认为Type=simple,这意味着第一个进程被视为主服务进程。它启动的那一刻,整个服务就被认为是“活动的(启动的)”;它退出的那一刻,整个服务都会停止。

另一种常见模式是Type=forking,其中初始进程预计至少分叉一次并退出,让子进程运行在“后台”或“守护进程”,正如某些人所说的那样。

但是,如果您正在使用“whateverctl”工具,您总是会看到需要的行为Type=forking,因为该工具本身将尝试“在后台”启动守护程序并自行退出。