很久以前我的电脑每次开机都需要手动卸载冲突的驱动,我曾想研究过如何设置开机自动执行脚本。在网上找到了很多类似于 写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 是为了导入环境变量。
Comments