[Systemctl]Linux程序保持后台运行

前言

在 Linux 系统中,我们经常需要一些服务或应用程序在系统启动后自动运行。在自建RustDesk服务器这篇文章中,霜狐讲述了三种让程序在后台持续运行的方法

[Rustdesk]自建Rustdesk远程桌面注册/中继服务器
准备工作 Rustdesk是一款开源的远程桌面软件,支持安卓/Windows/Mac/Linux/IOS全平台使用,还可以搭建自己的中继服务器。本文将带大家……

而使用Systemd是一个不错的选择,不过配置起来略显麻烦,所以单独写成一篇教程。

Systemctl和Systemd

Systemctl是 Systemd 的主命令,用于操作Systemd。Systemd 是一个系统和服务管理器,它被设计用来作为操作系统的初始化系统(init system)。它为操作系统提供了一个统一的方式去启动、停止以及管理各种服务。

Systemctl 基础命令

查看所有服务的状态:

systemctl list-units --type=service

启动服务:

systemctl start <service-name>

停止服务:

systemctl stop <service-name>

重启服务:

systemctl restart <service-name>

查看服务状态:

systemctl status <service-name>

启用服务(开机启动):

systemctl enable <service-name>

禁用服务:

systemctl disable <service-name>

创建服务

要让一个程序在后台持续运行,我们需要在/etc/systemd/system/目录下创建一个.service文件,并编写服务单元文件.

假设脚本名为myapp.py,位于/home/user/myapp目录下。

创建一个.service文件

nano /etc/systemd/system/myapp.service

添加以下内容,然后Ctrl+X,Y保存。

[Unit]
Description=My Application Service
After=network.target

[Service]
Type=forking
ExecStart=/home/user/myapp/myapp

[Install]
WantedBy=multi-user.target

Description: 服务描述。

After: 该服务要在什么服务启动后启动,这里指定服务在网络服务启动之后启动。

Type,定义启动时的进程行为。

ExecStart: 启动当前服务的命令。

WantedBy: 指定服务启动级别。

更多

Type,定义启动时的进程行为。它有以下几种值。
Type=simple,默认值,执行ExecStart指定的命令,启动主进程
Type=forking,以 fork 方式从父进程创建子进程,创建后父进程会立即退出
Type=oneshot,一次性进程,Systemd 会等当前服务退出,再继续往下执行
Type=dbus,当前服务通过D-Bus启动
Type=notify,当前服务启动完毕,会通知Systemd,再继续往下执行
Type=idle,若有其他任务执行完毕,当前服务才会运行
ExecStart,启动当前服务的命令
ExecStartPre,启动当前服务之前执行的命令
ExecStartPost,启动当前服务之后执行的命令
ExecReload,重启当前服务时执行的命令
ExecStop,停止当前服务时执行的命令
ExecStopPost,停止当其服务之后执行的命令
RestartSec,自动重启当前服务间隔的秒数
Restart,定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
TimeoutSec,定义 Systemd 停止当前服务之前等待的秒数
Environment,指定环境变量

启动服务

加载新的服务

systemctl daemon-reload

启动服务

systemctl start myapp.service

查看服务状态

systemctl status myapp.service

开启服务开机自启

systemctl enable myapp.service

 

阅读剩余
THE END