Linux使用systemd后台运行服务并自启

Systemd 服务的内容主要分为三个部分,控制单元(unit)的定义、服务(service)的定义、以及安装部分。
服务的路径位于/etc/systemd/system目录(系统的服务位于/usr/lib/systemd/system),以 .service 结尾的单元(unit)配置文件,如果需要开机不登录运行程序,需要创建系统服务

自定义service文件的写法

创建xxx.service文件

文件参数大致如下,详情在后面:

[Unit]
Description=描述
Environment=环境变量或参数(系统环境变量此时无法使用)
After=network.target

[Service]
Type=forking
WorkingDirectory=工作路径
EnvironmentFile=所需环境变量文件或参数文件
ExecStart=启动命令(需指定全路径)
ExecStop=停止命令(需指定全路径)
User=以什么用户执行命令

[Install]
WantedBy=multi-user.target

定义控制单元 [Unit]

从上面的例子中我们看到Unit内容如下:

[Unit]
Description=Nginx - high performance web server
After=network.target
  • Description:代表整个单元的描述,可根据需要任意填写。
  • Before/After:指定启动顺序。
    network.target代表有网路,network-online.target代表一个连通着的网络。

定义服务本体 [service]

上面的Service中服务本体内容大约为:

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
  1. Type:服务的类型,各种类型的区别如下所示

    • simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。
    • forking:标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。
    • oneshot:适用于那些被一次性执行的任务或者命令,它运行完成后便了无痕迹。因为这类服务运行完就没有任何痕迹,我们经常会需要使用 RemainAfterExit=yes。意思是说,即使没有进程存在,Systemd 也认为该服务启动成功了。同时只有这种类型支持多条命令,命令之间用;分割,如需换行可以用\。
    • dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。
  2. ExecStart:在输入的命令是start时候执行的命令,这里的命令启动的程序必须使用绝对路径,比如你必须用/sbin/arp而不能简单的以环境变量直接使用arp。
  3. ExecStop:在输入的命令是stop时候执行的命令,要求同上。
  4. ExecReload:这个不是必需,如果不写则你的service就不支持restart命令。ExecStartExecStop是必须要有的。
    其实服务本体中还有更多的参数,这里在额外列举一些常用的参数:

    • User:指定用户运行
    • Group:指定用户组运行
    • WorkingDirectory:进程工作目录,也就是说在执行前会先切换到这个目录

安装服务 [install]

上面例子中安装服务内容为:

[Install]
WantedBy=multi-user.target
  • WantedBy:设置服务被谁装载,一般设置为multi-user.target

systemd的部分指令

这里以nginx为例

#启动nginx
systemctl start nginx.service
#重载nginx
systemctl reload nginx.service
#停止nginx
systemctl stop nginx.service
#重启nginx
systemctl restart nginx.service
#如果需要开机启动
systemctl enable nginx.service
#如果需要取消开机启动
systemctl disable nginx.service

例:

创建go-cqhttpqq机器人服务

##### 创建一个go-cqhttp.service文件
/etc/systemd/system/go-cqhttp.service

内容如下

[Unit]
Description=go-cqhttp
After=network.target

[Service]
Type=simple
WorkingDirectory=/www/wwwroot/oldwubot/go-cqhttp
ExecStart=/usr/local/bin/go-cqhttp
ExecStop=/bin/kill -s TERM $MAINPID

[Install]
WantedBy=multi-user.target
设置自启

systemctl enable go-cqhttp.service

创建nginx服务

[Unit]
Description=Nginx - high performance web server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop

[Install]
WantedBy=multi-user.target
参考资料:https://www.xiaoz.me/archives/14458/comment-page-1
无标签
评论区
头像
文章目录