如何使用 systemd 在启动时运行 Linux 程序

需要在启动时启动 Linux 程序吗? systemd 软件提供了一种在任何带有 systemd 的 Linux 发行版上执行此操作的方法——现在大多数发行版都是这样,包括 Ubuntu。我们将引导您完成创建集成服务的过程——它甚至会与期刊对话。
本教程演示如何设置在您启动系统时启动的系统服务。要在登录时启动图形程序,请改用桌面的启动管理器。
启动时运行程序
有时,您在计算机上安装的软件会自行挂钩到 Linux 启动过程中,以便每次启动计算机时自动启动该程序。您可以使用您自己的程序和脚本,或者实际上是您计算机上的任何其他程序,轻松实现相同的行为。
启动时启动的程序由系统和服务管理器 systemd
控制。 systemd
是启动时运行的第一个进程。它的进程 ID (PID) 始终为 1。计算机中运行的所有其他进程都由 systemd
启动,或者由 systemd
已经启动的进程启动。
在后台运行的程序称为守护进程或服务。 systemd
末尾的“d”代表守护进程。在本文中,我们将创建一个示例服务。要勾选所有方框,我们的服务必须是:
- 通过服务单元文件与
systemd
集成 - 启动时启动
- 可使用
systemctl
进行控制,systemd
的控制界面 - 能够写日记
创建服务程序
我们需要一个 systemd
将启动的程序。我们将创建一个简单的脚本,称为“htg.sh”。本教程使用 Gedit 文本编辑器,但您可以使用您喜欢的任何文本编辑器。
touch htg.sh
gedit htg.sh

gedit
编辑器将打开。将以下文本复制并粘贴到编辑器中。
#!/bin/bash
echo "htg.service: ## Starting ##" | systemd-cat -p info
while :
do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
echo "htg.service: timestamp ${TIMESTAMP}" | systemd-cat -p info
sleep 60
done
保存更改并关闭编辑器。

该脚本并没有做很多事情,但有几点值得注意。
- 两条
echo
行通过systemd-cat
进行管道传输,这是一个从程序中获取输出并将其发送到日志的程序。期刊的条目具有优先权。我们使用-p
(优先级)选项来表明我们的消息仅供参考 (info)。它们不是重要的错误或警告。 - 有一个无限的
while
循环。 TIMESTAMP
变量设置为当前日期和时间。这被格式化为消息并发送给期刊。- 然后脚本休眠 60 秒。
- 60 秒后重复循环。因此,此脚本每分钟向日志写入一条带时间戳的消息。
我们将脚本复制到 /usr/local/bin
目录。
sudo cp htg.sh /usr/local/bin

我们需要让它可执行:
sudo chmod +x /usr/local/bin/htg.sh

创建服务单元文件
systemd
启动的每个程序都有一个定义文件,称为服务单元文件。这包含某些属性,systemd
可以使用这些属性来定位和启动程序,并定义它的一些行为。
我们需要为我们的新服务创建一个单元文件,但谨慎的做法是确保现有的单元文件都没有我们想要为我们的新服务命名的名称。
sudo systemctl list-unit-files --type-service

您可以滚动浏览按字母顺序排序的单元文件列表,并检查您要使用的名称是否未被占用。

我们的服务将被称为“htg.service”。没有单元文件具有该名称,因此我们可以继续创建我们的单元文件。
sudo gedit /etc/systemd/system/htg.service

gedit
编辑器将打开。将以下文本复制并粘贴到编辑器中:
[Unit]
Description=How-To Geek Service Example
Wants=network.target
After=syslog.target network-online.target
[Service]
Type=simple
ExecStart=/usr/local/bin/htg.sh
Restart=on-failure
RestartSec=10
KillMode=process
[Install]
WantedBy=multi-user.target
保存更改并关闭编辑器。

这些条目具有以下含义。这些是典型的条目。我们的简单服务实际上并不需要它们中的大部分,但包含它们可以让我们解释它们。
- 描述:这是对您的服务的文字描述。
- 想要:我们的服务想要——但不要求——网络在我们的服务开始之前就已经启动。
- 之后:在此服务成功启动后应启动的单元名称列表(如果它们尚未运行)。
- 类型:简单。
systemd
将认为此服务在ExecStart
指定的进程被派生后立即启动。 - ExecStart:应该启动的进程的路径。
- 重新启动:何时以及是否应重新启动服务。我们已将其设置为“失败时”。
- RestartSec:尝试重新启动服务之前等待的时间。此值以秒为单位。
- KillMode: 定义如果我们要求
systemctl
停止服务,systemd
应该如何终止进程。我们将其设置为“处理”。这导致systemd
仅在主进程上使用SIGTERM
信号。如果我们的服务是一个重要的程序而不是一个简单的脚本,我们会将其设置为“混合”以确保任何派生的进程也被终止。 - WantedBy:我们把这个设置为“multi-user.target”,意思是只要系统处于多用户可以登录的状态就应该启动服务,无论是还是没有可用的图形用户界面。
单元文件不需要是可执行的,但单元文件的权限应该限制谁可以编辑它。您不希望恶意或恶作剧的用户更改单元文件以使其完全执行不同的程序。
此命令将授予所有者读写权限,以及组的读取权限。其他人将没有权限。
sudo chmod 640 /etc/systemd/system/htg.service

我们可以让 systemctl
为我们检查单元文件的语法,即使服务还没有运行。将报告任何错误。 (实际上,“.service”部分对于大多数命令都是可选的。)
systemctl status htg.service

没有突出显示错误,这意味着我们的单元文件在语法上是正确的。
启动服务
添加新的单元文件或编辑现有单元文件时,必须告诉 systemd
重新加载单元文件定义。
sudo systemctl daemon-reload
如果您希望在启动时启动服务,您必须启用它:
sudo systemctl enable htg
启用服务不会启动它,它只会将其设置为在启动时启动。要现在 启动服务,您必须使用带有start
选项的systemctl
。
sudo systemctl start htg

验证服务
手动启动服务或重启计算机后,我们可以验证我们的服务是否正常运行。
sudo systemctl status htg.service

为我们显示服务的状态。

- 绿点表示我们的服务正常运行。
- 服务的名称是“htg.service”,长描述是我们在单元文件中提供的。
- 我们看到加载了哪个单元文件“/etc/systemd/system/htg.service”。
- 服务处于活动状态,并为我们列出了服务启动的时间。
- 它的 PID 是 7762。
- 有两项与该服务相关的任务。
- 该服务总共使用了 928 KB 的内存。
- 控制组包括“htg.sh”脚本和由“htg.sh”启动的
sleep
命令。大多数情况下,sleep
命令会为该服务完成工作。
我们还看到了该服务生成的最后 10 个日记条目。毫不奇怪,它们都相隔一分钟。
停止和禁用服务
如果需要停止服务,可以使用以下命令:
sudo systemctl stop htg.service

这会停止该服务,但不会阻止它在下次重新启动计算机时重新启动。要停止在启动时启动的服务,您需要禁用它:
sudo systemctl disable htg.service

如果服务正在运行,此命令不会停止它。它只是告诉 systemd
在下次重启时不要启动该服务。
如果要停止服务并阻止它在启动时启动,请使用这两个命令。
服务提示
在尝试将其作为服务启动之前,请确保您的程序按预期运行。
Linux Commands | ||
Files | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm · scp · gzip · chattr · cut · find · umask · wc | |
Processes | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg · pidof · nohup · pmap | |
Networking | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw · arping · firewalld |
RELATED: Best Linux Laptops for Developers and Enthusiasts