0%

如何利用systemctl管理后台服务

利用周末时间写了一个简单的后台推送服务,需要一直保持在后台跑。搜了网上的一些方案,比如
1.写一个sh脚本,在运行的命令最后加一个”&”,虽然这个方法可以保持后台运行,但是只要关掉终端,这个服务也会被kill。

2.使用nohup这个命令,nohup的意思是忽略SIGHUP信号。

  • SIGHUP信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 也就是关闭终端的时候发出的,这个信号的默认操作为终止进程,因此前台进程组和后台有终端输出的进程就会中止。
  • 如果用nohup运行脚本的话,需要用kill命令来终止,比较麻烦。

最后发现用systemctl来管理更加方便,遵循以下步骤就能一劳永逸。

1.写一个service文件,总共分三个部分[Unit]、[Service]和[Install]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#[Unit]部分主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别
[Unit]
Description=pusher
#After=network.target remote-fs.target nss-lookup.target

#[Service]部分是服务的关键,是服务的一些具体运行参数的设置
#Type=forking是后台运行的形式,
#PIDFile为存放PID的文件路径,
#ExecStart为服务的具体运行命令,ExecReload为重启命令,ExecStop为停止命令
#Restart指发生异常时是否重启
#PrivateTmp=True表示给服务分配独立的临时空间
#Environment=执行环境设置(绝对路径)
#注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!
[Service]
Type=forking
ExecStart=/www/wwwroot/servicelog.com/runtime/run_pusher.sh
KillMode=control-group
Restart=no
PrivateTmp=true

#[Install]部分是服务安装的相关设置,可设置为多用户的
[Install]
WantedBy=multi-user.target

2.将写好的service文件放到/usr/lib/systemd/system

3.记好以下几个命令就行了

1
2
3
4
5
6
7
8
9
10
#启动
systemctl start xxx.service
#重启
systemctl restart xxx.service
#停止
systemctl stop xxx.service
#重载
systemctl reload xxx.service
#状态
systemctl status xxx.service

4.还能实现开机自启动

1
2
3
4
#在开机启用服务
systemctl enable xxx.service
#禁止开机服务
systemctl disable xxx.service

参考链接:
1.Systemctl - ArchWiki
2.systemctl 命令详解及使用教程 | linux资讯

Welcome to my other publishing channels