Linux service 文件 & 开机自动执行脚本

日常操作
Article Directory
很久以前我的电脑每次开机都需要手动卸载冲突的驱动,我曾想研究过如何设置开机自动执行脚本。在网上找到了很多类似于 写rc.local 文件的文章,但是,这并不是一个很好的方法。不便于管理,且众多发行版已经开始弃用。也较为复杂。

可通过service 来实现。

在日常使用常用命令 systemctl restart xxx这样的命令
例如在重启nginx 时

1
2
3
systemctl restart nginx 
#其实完整命令是这样的
systemctl restart nginx.service

虽然本质上等同于nginx -s reload

service文件存放在/usr/lib/systemd/system目录,或/etc/systemd/system

##service 文件
打开nginx的service 文件 除去注释部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

[Unit]
Description=A high performance web server and a reverse proxy server
Documentation=man:nginx(8)
After=network.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

###各字段含义
直接复制转载
详细含义去其他博客看一下,我只了解几个简单的参数
一个简单的service 可以只这样

1
2
3
4
5
6
7
8
9
[Unit]
Description=Java test service
After=network.target

[Service]
Type=forking
ExecStart=/bin/bash /opt/autostart.sh
ExecStop=/bin/kill -s QUIT $MAINPID

配置文件里面最重要的字段是ExecStart
ExecStart字段:定义启动进程时执行的命令
上面的例子中,启动sshd,执行的命令是/bin/bash /opt/autostart.sh,其中的变量$OPTIONS就来自EnvironmentFile字段指定的环境参数文件。

与之作用相似的,还有如下这些字段。

ExecReload字段:重启服务时执行的命令
ExecStop字段:停止服务时执行的命令
ExecStartPre字段:启动服务之前执行的命令
ExecStartPost字段:启动服务之后执行的命令
ExecStopPost字段:停止服务之后执行的命令

##需要注意的是,在service 启动的时候,系统环境变量可能未加载,所以,命令需要用绝对路径,需要的环境变量也需要自己手动导入,

例如,在service用来启动一个java程序的时候,很可能会因为找不到jre的位置而启动失败。这时候你需要在启动脚本中,export jre的路径。

写好service文件之后,讲它放到 /etc/systemd/system
或/usr/lib/systemd/system

例如我写了一个javademo.service 当你需要启动他的时候,

1
2
3
4
5
6
7
8
9
10
11
systemctl start javademo

#停止
systemctl stop javademo
#查看运行状态
systemctl status javademo
#设置开机自启
systemctl enable javademo
#取消开机自启
ststemctl disable javademo

##这样就不用费心的每次开机手动执行了。service的作用远不止于此,它可以在出错是自动尝试重启,简化了操作流程。

比如我的网站上运行一个java后端,我明天三点重启服务器,java后端就需要自动运行,于是我的service文件如下

1
2
3
4
5
6
7
8
9
10
11
[Unit]
Description=v2ray-web-java
After=network.target network-online.target nss-lookup.target mysql.service mariadb.service mysqld.service
[Service]
Type=forking
StandardError=journal
ExecStart=/bin/bash /opt/jar/start.sh
ExecStop=/bin/bash /opt/jar/stop.sh
[Install]
WantedBy=multi-user.target

start 脚本如下

1
2
3
4
source /etc/profile
nohup java -jar -Xmx40m -XX:MaxDirectMemorySize=8M -XX:MaxMetaspaceSize=48m /opt/jar/vxxxy.jar > /dev/null 2>&1 &
echo > /var/run/vxxx.pid

source /etc/profile 是为了导入环境变量。

Author: 哒琳

Permalink: http://blog.jieis.cn/2020/bffb3da9-31ea-4b97-bdbf-6c895bda6785.html

Comments