我创建了一个 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在服务第一次启动时立即调用(启动,然后立即停止)。
任何线索,我哪里出错了?
PS:indexControl是一个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)
就是这样,现在该服务正在执行所写的内容。当然被调用的脚本不会,但这是另一个问题。
您没有告诉 systemd 这是什么类型的守护进程以及对它的期望(最重要的是,它需要知道守护进程何时最终启动)。
默认为Type=simple,这意味着第一个进程被视为主服务进程。它启动的那一刻,整个服务就被认为是“活动的(启动的)”;它退出的那一刻,整个服务都会停止。
另一种常见模式是Type=forking,其中初始进程预计至少分叉一次并退出,让子进程运行在“后台”或“守护进程”,正如某些人所说的那样。
但是,如果您正在使用“whateverctl”工具,您总是会看到需要的行为Type=forking,因为该工具本身将尝试“在后台”启动守护程序并自行退出。
| 归档时间: |
|
| 查看次数: |
15323 次 |
| 最近记录: |