我用了这答案作为指南,帮助我编写一个启动脚本,用于 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 文件中的解决方案只会在单个用户登录时运行该命令,而不是系统范围的解决方案。