使用 Systemd 在启动时运行命令

使用 Systemd 在启动时运行命令

我用了答案作为指南,帮助我编写一个启动脚本,用于 systemd 在我的机器启动时启动我的 Jenkins 容器。但是,该脚本不起作用。以下是脚本:

[Unit]
Description=Docker container that houses the Jenkins build service.
After=network-online.target

[Service]
Group=docker
ExecStart=/usr/bin/docker start jenkins
ExecStop=/usr/bin/docker stop jenkins

[Install]
WantedBy=multi-user.target

我把它放在了/etc/systemd/system/jenkins.service

当我运行 时sudo systemctl start jenkins,什么都没有发生。没有错误或任何打印输出,并且容器没有启动(如果我运行docker ps,则没有列出正在运行的容器)。

我可以/usr/bin/docker start jenkins从命令行手动运行,并且启动非常顺利,所以问题似乎出在我编写脚本的方式上,但我不明白为什么它没有按预期工作。任何帮助都非常感谢。

答案1

不要将脚本放入/etc/systemd/system/jenkins.service,而是将命令放入~/.bashrc这样你的脚本就会在 Ubuntu 每次启动时自动运行(这将是你从终端运行脚本时使用的相同命令)。这是一个 bash 文件,每当您的 PC 在 Ubuntu 中启动时都会运行。

例如,如果我希望 /home/Kanishk/Pictures/Delhi.png 在我启动 Ubuntu 时运行,我会将命令shotwell /home/Kanishk/Pictures/Delhi.png放在~/.bashrc文件,以便 Shotwell 可以打开我的照片。

如果您宁愿运行 Jetkins 包而不是该脚本,请输入命令来运行该包而不是脚本。

答案2

我回答过类似的问题这里适用于其他 Linux 发行版。该解决方案与 systemd 配合使用,使 /etc/rc.local 文件能够在启动时运行命令。

该案例的脚本中有一些您未在此处使用的细节:

sudo vim /etc/systemd/system/rc-local.service

然后添加下面的内容。

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
 WantedBy=multi-user.target

尝试使用脚本的其他选项来激活日志并找出发生了什么,例如:

[Manager]
LogLevel=info
LogTarget=syslog|console

有一个无数您可以使用的其他 systemd 配置选项。

显然,将命令包含在 ~/.bashrc 文件中的解决方案只会在单个用户登录时运行该命令,而不是系统范围的解决方案。

相关内容