Systemd无法启动脚本?


9

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

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

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

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

Systemctl的状态告诉我脚本已成功运行并退出。脚本仍然无效。如果我从外壳运行脚本,则可以正常运行。

你们中有人知道我的问题吗?


3
显然,如果您的脚本启动了其他内容,则需要“ Type = forking”,因为我不熟悉之前的设置,因此我觉得有些愚蠢。
TokyoMEWS 2012年

1
+1解决。请发布您的解决方案作为答案,并接受它来帮助存在相同问题的其他人。
terdon 2012年

1
@TokyoMEWS:更准确地说,如果脚本在其子进程运行时启动其他操作并退出,则需要“ Type = forking”。
user1686 2012年

Answers:


7

除了TokyoMEWS自己发现的...

显然,如果您的脚本启动了其他内容,则需要“ Type = forking”

(这不是完全正确的- Type=forking仅当您的脚本在其子进程运行时退出时才有必要)

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

  1. 我猜想“在屏幕上显示”是指脚本只是向stdout写一些东西。这并没有往屏幕在引导过程中-更确切地说,从服务的stdout一切都发送到日志(或根据您的systemd版本到syslog)。

  2. 如果您确实尝试过写入屏幕(例如使用echo Hi >/dev/tty1),那么很可能在agetty在显示登录提示之前清除屏幕时脚本的输出就会消失。(为避免这种情况,您必须订购After=getty@tty1.service)。

  3. 要将某些内容写入文件,您需要以读写方式安装文件系统。为此,After=local-fs.target 可能有必要,否则可能会太早启动设备。但这取决于特定的OS配置。


1

如果你的脚本定义ExecStop条款,以及,你需要设置“ RemainAfterExit = YES”,以避免ExecStop被后自动调用ExecStart。执行ExecStart命令后,这将使您的服务处于“ 活动 ” 状态。

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.