1、简介
经常碰到机器断电之后需要重启一大堆服务,为了防止这种事情发生,设置开机自启的脚本十分的重要,我们习惯性的做法就是编写一个重启脚本,然后在 /etc/rc.local 中去完成开机执行。例如下面这样:
# chmod +x /etc/rc.local
# vi /etc/rc.local
/usr/local/nginx/sbin/nginx
service start tomcat
/usr/local/apache/bin/apachectl start
service mysql star
/home/www/guonei_netprotect.sh
测试结果,服务都启动了 停止服务,然后查看端口,重启系统,查看服务是否自启动,发现服务已经自启
2、通过 Crontab 实现
Crontab 可以使用 @reboot 来执行主机启动之后的命令。首先在命令行输入:
$ crontab -e
然后添加以下内容:
@reboot /root/script/restart.sh
完成后,这个脚本就可以在重启的时候自动执行了。
注意 :服务器宕机之后,人工要确定脚本和服务是否启动正常;或者刚部署服务和脚本时,重启服务器测试。
其它的一些进阶玩法:
# 在启动 5 分钟后运行指定脚本
@reboot sleep 300 && /home/wwwjobs/clean-static-cache.sh
3、通过 Systemd 实现
首先编写一个名为 restart 的 Systemd 服务:
$ vim /lib/systemd/system/restart.service
[Unit]
Description=restart
After=default.target
[Service]
ExecStart=/root/script/restart.sh
[Install]
WantedBy=default.target
然后启用这个 Systemd 服务:
$ systemctl daemon-reload
$ systemctl enable restart.service
完成后,这个服务对应的脚本就可以自动开机自启了。 nginx开机自启 通用方式启动nginx
/usr/local/nginx/sbin/nginx #启动
/usr/local/nginx/sbin/nginx -s reload #重启
/usr/local/nginx/sbin/nginx -s quit #关闭nginx
systemd 管理控制启动模式
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx
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 quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
参数详解
systemctl restart nginx
systemctl enable nginx
systemctl stop nginx
二进制安装tomcat 实现systemd管理控制
wget 120.78.77.38/file/jdk-8u231-linux-x64.rpm
wget 120.78.77.38/file/apache-tomcat-9.0.27.tar.gz
rpm -ivh jdk-8u231-linux-x64.rpm #rpm直接安装jdk
配置环境变量
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_231-amd64
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=${JAVA_HOME}/bin:$PATH
source /etc/profile
java -version #检测环境
安装tomcat
tar -xf apache-tomcat-9.0.27
mv apache-tomcat-9.0.27 /usr/local/tomcat
启动tomcat
sh /usr/local/tomcat/bin/startup.sh #启动
sh /usr/local/tomcat/bin/shutdown.sh #关闭
systemd管理控制启动
vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=tomcat server
Wants=network-online.target
After=network.target
[Service]
Type=forking
Environment="JAVA_HOME=/usr/java/jdk1.8.0_231-amd64"
Environment="PATH=$JAVA_HOME/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin"
Environment="CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar"
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecStop=/usr/local/tomcat/bin/shutdown.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
systemctl restart tomcat #启动
systemctl enable tomcat #配置自启
systemctl stop tomcat #停止服务
systemctl status tomcat #检测状态
以上两个实战nginx和tomcat程序中自带了启动停止脚本,如果启动得程序没有自带脚本则需要自己编写一个类似得启动停止脚本
部署jar程序 实现systemd管理控制 实际得项目中会有一些jar程序需要启动 如果手动启动则需要输入一大串命令 停止则需要杀掉进程来停止,很麻烦
举一个实际启动得例子切换到jar目录下
java -jar decode.jar -Dconfig=/usr/local/abc/application.properties
编写一个启动脚本
vim demo.sh
#!/bin/bash
#
source /etc/profile
jarName="abc-web.jar"
workDir="/usr/local/abc"
start(){
cd ${workDir} && java -jar ${jarName} --spring.profiles.active=prod --server.port=9630 >uams.log 2>&1 &
}
stop(){
ps -ef | grep -qP "(?<=-jar)\s+${jarName}" && kill $(ps -ef | grep -P "(?<=-jar)\s+${jarName}" | awk '{print $2}')
}
case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
esac
编写 systemd 配置文件
vim /usr/lib/systemd/system/abc.service
[Unit]
Description=uams server
Wants=network-online.target
After=network.target
[Service]
Type=forking
WorkingDirectory=/usr/local/abc/
ExecStart=/bin/bash uams.sh start
ExecStop=/bin/bash uams.sh stop
ExecReload=/bin/bash uams.sh restart
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动abc服务
systemctl restart abc #启动
systemctl enable abc #配置自启
systemctl stop abc #停止服务
systemctl status abc #检测状态
设置脚本开机自启
建一个start.sh脚本文件,并在该文件中写入以下脚本:
#!/bin/sh
# 启动消息工具
cd message-tool
nohup python3 main.py >server.log 2>&1 &
# 启动ssim工具
cd ..
cd ssim-service
cd backend
nohup python3 main.py >server.log 2>&1 &
cd ..
cd frontend
export HOST=0.0.0.0 && nohup yarn start >/dev/null 2>&1 &
exit 0
后台运行脚本
nohup python3 main.py >server.log 2>&1 &
拷贝shell脚本至启动目录下并设置文件访问权限;
sudo mv start.sh /etc/init.d/
cd /etc/init.d/
sudo chmod 755 start.sh #设置start.sh文件的访问权限:
更新系统启动脚本;
cd /etc/init.d/
sudo update-rc.d start.sh defaults 90
命令中的90为设置的启动序号,越大代表执行越晚; 检查启动项状态;
#sudo systemctl list-unit-files
或者
#sudo systemctl status start.service
移除开机自启动脚本
sudo update-rc.d -f start.sh remove
sudo systemctl stop start.service
sudo systemctl disable start.service
4参考文档 https://www.google.com https://tinyurl.com/6ryafefw https://www.cyberciti.biz/faq/linux-execute-cron-job-after-system-reboot/
https://mp.weixin.qq.com/s/nWb7LtxEhUMWwd2y7tmU8Q
最简明的 Systemd 进程管理教程 https://mp.weixin.qq.com/s/-slVuB9V5q-pmAwevn0aWA 来源:https://blog.csdn.net/weixin_43546282/article/details/113761180
如何让linux机器开机自动运行shell脚本 https://www.jianshu.com/p/724d7655d5c2
|