我有一个 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
仅当您的脚本在其子进程运行时退出)
...其他可能的问题有:
我猜你说的“在屏幕上显示”是指脚本只是将一些内容写入 stdout。这确实不是在启动过程中转到屏幕——相反,服务的标准输出中的所有内容都会发送到杂志(或者根据您的 systemd 版本发送到 syslog)。
如果你做过实际尝试写入屏幕(例如使用
echo Hi >/dev/tty1
),那么脚本的输出很可能在以下情况下消失:代理在显示登录提示之前清除屏幕。(为了避免这种情况,您必须订购该设备[email protected]
)。要将内容写入文件,您需要将文件系统挂载为读写。为此,
After=local-fs.target
可能否则设备可能过早再次启动。但这取决于具体的操作系统配置。
答案2
如果您的脚本定义执行停止子句中,您需要设置“退出后继续=yes”以避免执行停止之后自动调用执行开始。这将使您的服务处于状态“积极的“执行后执行开始命令。
[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes