Systemd 无法启动脚本?

Systemd 无法启动脚本?

我有一个 BASH 脚本,我想在启动时运行它。我的系统正在运行 systemd,因此我创建了一个 .service 文件,其中包含我认为必要的信息:

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

我使用 systemctl enable 来“注册”它并重新启动。启动时,我被告知我的脚本将被执行,但我既看不到 ECHO 应该在屏幕上显示的任何消息,也没有根据我在脚本中写的内容将任何内容写入文件。此外,它不会启动它应该启动的应用程序。

Systemctl status 告诉我脚本已运行并成功退出。但脚本仍然没有任何效果。如果我从 shell 运行脚本,它运行得很好。

你们有谁知道我的问题可能是什么吗?

答案1

除了 TokyoMEWS 自己发现的情况之外……

显然,如果你的脚本启动了其他东西,它需要“Type=forking”

(这并不完全正确 –Type=forking仅当您的脚本在其子进程运行时退出

...其他可能的问题有:

  1. 我猜你说的“在屏幕上显示”是指脚本只是将一些内容写入 stdout。这确实不是在启动过程中转到屏幕——相反,服务的标准输出中的所有内容都会发送到杂志(或者根据您的 systemd 版本发送到 syslog)。

  2. 如果你做过实际尝试写入屏幕(例如使用echo Hi >/dev/tty1),那么脚本的输出很可能在以下情况下消失:代理在显示登录提示之前清除屏幕。(为了避免这种情况,您必须订购该设备[email protected])。

  3. 要将内容写入文件,您需要将文件系统挂载为读写。为此,After=local-fs.target 可能否则设备可能过早再次启动。但这取决于具体的操作系统配置。

答案2

如果您的脚本定义执行停止子句中,您需要设置“退出后继续=yes”以避免执行停止之后自动调用执行开始。这将使您的服务处于状态“积极的“执行后执行开始命令。

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes

相关内容