Linux 守护进程的启动方法
Systemd 入门教程 命令
Systemd 入门教程:实战篇
/etc/rc.local
- 将启动命令直接放到这个文件中
https://blog.csdn.net/u013401853/article/details/71079595
systemctl 添加开机启动服务
- 首先创建一个针对于某个应用的开启启动服务
- 然后在服务文件中配置 start/stop/restart/的对应脚本
- 将服务程序和脚本文件放到响应的位置
- 开启开机自启服务,关闭或者暂停服务
下面以编写一个开机自启动的ROS launch文件为例
step1 创建 服务 ros_startup.service
mkdir scripts
touch ros_startup.service
## ros_startup.servicede的内容
[Unit]
Description=powerOn startup ros
[Service]
Type=simple
Restart=always
RestartSec=30
ExecStart=/usr/sbin/ros_start
ExecStop=/usr/sbin/ros_stop
ExecRestart=/usr/sbin/ros_restart
[Install]
WantedBy=multi-user.target
## Unit 服务的描述
## Service是最关键的部分
## Type =simple 启动程序后,常驻内存中(区别于oneShut)
## 30s后会自动重启
## 后面指定服务的启动、结束、重启的脚本
## Install:需要将该unit安装到哪个target上
step2 创建 服务启动、结束脚本
##ros_start
#!/bin/bash
source /opt/ros/kinetic/setup.bash
source /home/nvidia/catkin_ws/devel/setup.bash
roslaunch ydlidar lidar.launch
exit 0
----------
##ros_stop
#!/bin/bash
source /opt/ros/kinetic/setup.bash
source /home/nvidia/catkin_ws/devel/setup.bash
for i in $(rosnode list);do
rosnode kill $i;
done
killall roslaunch
exit 0
----------
## ros_restart
/usr/sbin/ros_stop
sleep 3
/usr/sbin/ros_start
exit 0
step3 将脚本和服务放到合适的位置
## 为了方便省事,也可以将其放到一个脚本文件中
## Install_service.sh
sudo cp ros_start /usr/sbin/
sudo cp ros_stop /usr/sbin/
sudo cp ros_restart /usr/sbin/
sudo cp ros_startup.service /lib/systemd/system/
sudo systemctl enable ros_startup.service
exit 0
step4 查看、启动和暂停 开机自启服务
- systemctl is-enabled ros_startup.service 查看服务是否已经启动
- sudo systemctl stop ros_startup.service 暂停服务(下次重启后还会继续自启动)
- sudo systemctl start ros_startup.service 开始服务
- sudo systemctl disable ros_startup.service 失能服务(重启后,不会自启动了)
- sudo systemctl enable ros_startup.service 使能服务
- sudo journalctl --unit ros_startup.service 查看服务日志
step5 删除自启动服务
## 如果不想再使用这个开机自启服务,可以创建一个脚本文件删除它
## uninstall_ros_service.sh 跟Install_service.sh相对应
#!/bin/bash
/usr/sbin/ros_stop
sudo systemctl disable ros_startup.service
sudo rm /usr/sbin/ros_start
sudo rm /usr/sbin/ros_stop
sudo rm /usr/sbin/ros_restart
sudo rm /lib/systemd/system/ros_startup.service
exit 0
supervisor
Supervisor: A Process Control System
Supervisord是一个守护进程的工具,当进程意外终止或服务器掉电起来后,希望进程能够自动运行,supervisord可以很好的为我们做这件事情。同时supervisord也自带监控界面,可以通过浏览器灵活的查看、操作。
supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常中断,则父进程可以准确的获取子进程异常中断的信息,通过在配置文件中设置autostart=ture,可以实现对异常中断的子进程的自动重启。
安装supervisor
sudo apt-get install supervisor
配置 supervisor
##/etc/supervisor
## 有 supervisord.conf配置文件 和 conf.d 文件夹目录
## 文件结尾有
[include]
files = /etc/supervisor/conf.d/*.conf
## 所以要想用supervisor管理自己的应用程序,只需要在conf.d文件夹中增添配置文件即可
这里以想让系统自启动几个 Python程序为例
cd /etc/supervisor/conf.d/
recive_hex_data_and_save_inDB.conf recive_json_data_from_server.conf
//文件内容
[program:recive_hex_data_and_save_inDB]
directory = /var/lib/cloud9/BBB
command = /usr/bin/python recive_hex_data_and_save_inDB.py
priority=1
numprocs=1
autostart=true
autorestart=true
开启 关闭supervisor的服务
- supervisord -c supervisor.conf 通过配置文件启动supervisor
- supervisorctl -c supervisor.conf status 查看状态
- supervisorctl -c supervisor.conf reload 重新载入配置文件
- supervisorctl -c supervisor.conf start [all]|[x] 启动所有/指定的程序进程
- supervisorctl -c supervisor.conf stop [all]|[x] 关闭所有/指定的程序进程
- sudo supervisorctl start program-name
crontab -e 定时任务
- 使用 crontab -e 编辑定时启动任务
- 适合执行按照一定频率执行的定时任务 (比如定时更新,定时清理回收站等)
- 可以按分钟、小时、天、月、周来设定定时任务的执行频率
- 如果是python脚本,可以先指定 conda环境等等
## 指令形式
分钟 小时 天 月 周 command
## 每分钟更新一下天气状况,并写到文件中
* * * * * /home/kiosk/anaconda3/envs/Scrapy/bin/python3 /home/kiosk/PycharmProjects/Scrapy/Weather/weather.py >> /home/kiosk/PycharmProjects/Scrapy/Weather/we
* * * * * ##每分钟
分钟 小时 天 月 周
*/2 * * * * ##每两分钟
* 08-17 * * * ##每天早上8点-下午5点每分钟
* 08-17 1,15 * * ##每月1号和15,早上8-下午5 每分钟
* 08-17 1,15 3 * ##三月的1号和三月的15,早上8-下午5 每分钟
* 08-17 1,15 3 5 ##三月的1号和三月的15,以及每个周5,早上8-下午5 每分钟
0-59 0,23 1,31 1,12 0,7 ##0和7都表示星期天
30 7 8 4 2 ## 4月8号的7.30,以及每个周二的7.30