[Systemctl]Linux程序保持后台运行
前言
在 Linux 系统中,我们经常需要一些服务或应用程序在系统启动后自动运行。在自建RustDesk服务器这篇文章中,霜狐讲述了三种让程序在后台持续运行的方法
而使用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
本文中所有的内容均以发布当天信息为参考,日后若有变更请以最新信息为准。