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

已发表: 2022-01-29
笔记本电脑上的程式化终端窗口。
Fatmawati Achmad Zaenuri/Shutterstock

需要在启动时启动 Linux 程序? systemd 软件提供了一种在任何带有 systemd 的 Linux 发行版上执行此操作的方法——现在大多数 Linux 发行版,包括 Ubuntu。 我们将引导您完成创建集成服务的过程——它甚至会与期刊对话。

本教程演示如何设置在您启动系统时启动的系统服务。 要在登录时启动图形程序,请改用桌面的启动管理器。

在启动时运行程序

有时,您安装在计算机上的软件会将自己挂接到 Linux 启动过程中,这样每次启动计算机时程序都会自动启动。 您可以使用自己的程序和脚本,或者实际上是您计算机上的任何其他程序,轻松实现相同的行为。

启动时启动的程序由systemd 、系统和服务管理器控制。 systemd是启动时运行的第一个进程。 它始终具有进程 ID (PID) 1。在您的计算机中运行的每个其他进程都由systemd启动,或者由systemd已经启动的进程启动。

在后台运行的程序称为守护程序或服务。 systemd末尾的“d”代表守护进程。 在本文中,我们将创建一个示例服务。 要勾选所有方框,我们的服务必须是:

  • 通过服务单元文件与systemd集成
  • 在启动时启动
  • 可使用systemctl控制, systemd的控制接口
  • 能写日记

创建服务程序

我们需要有一个systemd将启动的程序。 我们将创建一个名为“htg.sh”的简单脚本。 本教程使用 Gedit 文本编辑器,但您可以使用您喜欢的任何文本编辑器。

 触摸htg.sh
 gedit htg.sh 

广告

gedit编辑器将打开。 将以下文本复制并粘贴到编辑器中。

 #!/bin/bash

echo "htg.service: ## 开始 ##" | systemd-cat -p 信息

尽管 :
做
TIMESTAMP=$(日期 '+%Y-%m-%d %H:%M:%S')
echo "htg.service: 时间戳 ${TIMESTAMP}" | systemd-cat -p 信息
睡觉 60
完毕

保存更改并关闭编辑器。

gedit 编辑器中的 htg.sh 脚本

该脚本并没有做很多事情,但有几点值得注意。

  • 两条echo显线通过systemd-cat管道传输,该程序从程序获取输出并将其发送到日志。 期刊的条目被优先考虑。 我们使用-p (优先级)选项来指示我们的消息仅用于信息(信息)。 它们不是重要的错误或警告。
  • 有一个无限的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编辑器将打开。 将以下文本复制并粘贴到编辑器中:

 [单元]
描述=How-To Geek 服务示例

想要=network.target
After=syslog.target network-online.target

[服务]
类型=简单
ExecStart=/usr/local/bin/htg.sh
重启=失败
重启秒=10
KillMode=进程

[安装]
WantedBy=多用户.target

保存更改并关闭编辑器。

gedit 编辑器中的 htg.service 单元文件

这些条目具有这些含义。 这些是典型的条目。 我们简单的服务实际上并不需要它们中的大部分,但是包括它们可以让我们解释它们。

  • 描述:这是您的服务的文本描述。
  • Wants:我们的服务想要——但不要求——在我们的服务启动之前网络已经启动。
  • 之后:在此服务成功启动后应启动的单元名称列表(如果它们尚未运行)。
  • 类型:简单。 一旦ExecStart指定的进程被派生, systemd将认为该服务已启动。
  • ExecStart:应该启动的进程的路径。
  • 重新启动:何时以及是否应该重新启动服务。 我们已将其设置为“失败时”。
  • RestartSec:在尝试重新启动服务之前等待多长时间。 该值以秒为单位。
  • KillMode:定义如果我们要求systemctl停止服务, systemd应该如何杀死进程。 我们将此设置为“处理”。 这导致systemd仅在主进程上使用SIGTERM信号。 如果我们的服务是一个重要的程序而不是一个简单的脚本,我们会将其设置为“混合”以确保任何衍生的进程也被终止。
  • WantedBy:我们将此设置为“multi-user.target”,这意味着只要系统处于多个用户可以登录的状态,无论图形用户界面是否可用,都应该启动服务。

单元文件不需要是可执行的,但是单元文件的权限应该限制谁可以编辑它。 您不希望恶意或恶作剧的用户更改单元文件,以便它完全执行不同的程序。

该命令将授予所有者读写权限,以及对组的读取权限。 其他人将没有权限。

 sudo chmod 640 /etc/systemd/system/htg.service 

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

 systemctl 状态 htg.service 

广告

没有突出显示错误,这意味着我们的单元文件在语法上是正确的。

启动服务

当您添加新的单元文件或编辑现有的单元文件时,您必须告诉systemd重新加载单元文件定义。

 sudo systemctl daemon-reload

如果您希望在启动时启动服务,则必须启用它:

 sudo systemctl 启用 htg

启用服务不会启动它,它只会将其设置为在启动时启动。 要立即启动服务,您必须使用带有start选项的systemctl

 sudo systemctl start htg 

验证服务

手动启动服务或重启电脑后,我们可以验证我们的服务是否正常运行。

 sudo systemctl status htg.service 

为我们显示服务的状态。

终端窗口中 htg.service 的状态

  • 绿点表示我们的服务正常运行。
  • 服务的名称是“htg.service”,长描述是我们在单元文件中提供的。
  • 我们显示了哪个单元文件已加载“/etc/systemd/system/htg.service”。
  • 该服务处于活动状态,并为我们列出了该服务的启动时间。
  • 它的PID是7762。
  • 有两个与服务相关的任务。
  • 该服务总共使用了 928 Kibibytes 的内存。
  • 控制组包括“htg.sh”脚本和由“htg.sh”启动的sleep命令。 大多数时候, sleep命令会为这个服务工作。

我们还显示了此服务生成的最后 10 个日记帐分录。 不出所料,它们都相隔一分钟。

停止和禁用服务

如果需要停止服务,可以使用以下命令:

 sudo systemctl stop htg.service 

广告

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

 sudo systemctl 禁用 htg.service 

如果服务正在运行,此命令不会停止它。 它只是告诉systemd在下次重新启动时不要启动该服务。

如果要停止服务并阻止它在启动时启动,请使用这两个命令。

服务提示

在尝试将其作为服务启动之前,请确保您的程序按预期运行。

相关:适合开发人员和爱好者的最佳 Linux 笔记本电脑