自己创网站,pc端网站建设价格明细表,怎么用自己电脑做网站,研发一款app要多少钱系统进程运行异常崩溃后#xff0c;自动重启的方法
有的公司#xff0c;会写monitor守护进程#xff0c;监视各个进程的运行状态#xff0c;异常时#xff0c;自动重启#xff0c;但是这种#xff0c;通过一个进程 监护一个进程的做法#xff0c;不太完美#xff0c;…系统进程运行异常崩溃后自动重启的方法
有的公司会写monitor守护进程监视各个进程的运行状态异常时自动重启但是这种通过一个进程 监护一个进程的做法不太完美也是有崩溃的风险。
1、从硬件层面 一般大产品如汽车是不能完全依赖这种技术方案的会外接一个mcu来监控soc通过soc发送心跳包1 s发送一次mcu能收到就soc还活着的信号如果soc没有正常发送心跳包说明soc已经挂掉整个操作系统崩溃掉 mcu就可以通过供电给复位引脚一个电平信号重启soc。
这种是针对整个soc系统崩溃的方法。下面是软件层面进程崩溃的重启方法。
1、看门狗技术 soc的内部是有看门狗的可以通过看门狗检测soc某个进程是否卡死跑飞如果没有及时喂狗说明程序异常强制重启系统
2、通过脚本监控进程类似心跳包 这种就是init下设置系统
init 守护进程是 Linux 内核执行的第一个进程它的进程 ID (PID) 始终为 1。它的目的是初始化、管理和跟踪系统服务和守护进程。换句话说init 守护进程是系统上所有进程的父进程。
要创建一个服务需要编写 shell 脚本并存储在 /etc/init.d/ 目录下通过 service 命令启动、停止、重新启动服务。例如如下的 /etc/init.d/myservice
#!/bin/shMAXRSTCOUNT5;
PROCTOGO/mnt/hgfs/code/test/show#count is the counter of test started times
count0sys_reboot()
{echo system is going to reboot;reboot;
}main_loop()
{while :do#########################################ProStillRunning$(ps -aux |grep ${PROCTOGO} |grep -v grep)if [ -z $ProStillRunning ]; then#start testchmod x ${PROCTOGO}${PROCTOGO}fi#the running times counterlet countcount1echo test running times is $count#wait for test stoping...sleep 3#########################################done
}main_loop;etc/init.d/monitor-app.sh
#!/bin/bash
sleep 40while [ 1 ]
dofor procname in appdopgrep $procname /dev/nullif [ 0 -ne $? ]then/etc/init.d/autoapp start ##autoapp可以是脚本app等fidonesleep 30
doneetc/init.d/automhclient
#! /bin/sh
PATH/sbin:/usr/sbin:/bin:/usr/bincase $1 instart)echo -n Starting automhclient: export DISPLAY:0cd /usr/share/qt5/app/mhclient./automhclient echoexit 0;;stop)echo -n Shutting down automhclient: killproc automhclientecho;;restart)echo -n Restarting automhclient: $0 stop$0 startecho;;*)echo Usage: $0 start|stop 2exit 3;;
esac3、crontab
使用Linux的crontab和while循环配合pgrep和kill命令来监控并在进程崩溃时自动重启指定的进程。以下是一个简单的脚本示例用于监控名为myprocess的进程并在它崩溃时自动重启它
#!/bin/bash# 要监控的进程名
PROCESS_NAMEmyprocess# 无限循环检查进程是否运行
while true; do# 使用pgrep查找进程PROCESS_ID$(pgrep ${PROCESS_NAME})# 如果进程不存在启动进程if [ -z $PROCESS_ID ]; thenecho ${PROCESS_NAME} is not running. Starting it.../path/to/${PROCESS_NAME} fi# 暂停10秒钟然后重新检查进程状态sleep 10
donelinux监控自动重启崩溃的进程 可以使用Linux的crontab和while循环配合pgrep和kill命令来监控并在进程崩溃时自动重启指定的进程。以下是一个简单的脚本示例用于监控名为myprocess的进程并在它崩溃时自动重启它
#!/bin/bash# 要监控的进程名
PROCESS_NAMEmyprocess# 无限循环检查进程是否运行
while true; do# 使用pgrep查找进程PROCESS_ID$(pgrep ${PROCESS_NAME})# 如果进程不存在启动进程if [ -z $PROCESS_ID ]; thenecho ${PROCESS_NAME} is not running. Starting it.../path/to/${PROCESS_NAME} fi# 暂停10秒钟然后重新检查进程状态sleep 10
done将上述脚本保存为一个文件例如monitor.sh并给予执行权限
chmod x monitor.sh
然后使用crontab将其设置为随系统启动自动运行 crontab -e 在打开的编辑器中添加以下行使脚本在登录时自动运行
reboot /path/to/monitor.sh 确保将/path/to/monitor.sh替换为脚本的实际路径。这样即使进程崩溃myprocess也会被自动重启。
4、systemd机制重启
systemd设置进程重启 在systemd中如果你想要设置一个服务在崩溃时自动重启你可以通过配置服务的Restart属性来实现。
编辑服务的systemd配置文件。这通常位于/etc/systemd/system/目录下并且文件名通常与服务同名。
在配置文件中找到[Service]部分并添加或修改Restart属性。
例如如果你想要让一个名为my-service.service的服务在崩溃时自动重启你可以这样设置
[Service]
Typesimple
Restartalways
ExecStart/usr/bin/my-service在这个例子中Restartalways表示无论退出状态如何服务都会尝试重启。
保存配置文件并退出编辑器。
重新加载systemd管理器配置以确保新的设置生效
sudo systemctl daemon-reload 如果服务正在运行你可能需要停止并启动服务来应用新的重启策略
sudo systemctl restart my-service.service 确保在应用这些更改之前理解服务的逻辑并考虑可能的副作用例如频繁的重启可能会导致系统资源耗尽。
6、monit或supervisor /etc/init.d目录通常包含特定服务的启动脚本这些脚本用于初始化init、启动、停止、重启或检查系统服务的状态。
要监控/etc/init.d中的自动重启程序可以编写一个shell脚本或使用现有的监控工具如monit或supervisor。以下是一个使用monit的示例
安装monit
sudo apt-get install monit 配置monit
编辑/etc/monit/monitrc文件添加对服务的监控配置。
check process my_service with pidfile /var/run/my_service.pid start program “/etc/init.d/my_service start” stop program “/etc/init.d/my_service stop” if failed host 127.0.0.1 port 25 then restart if 3 restarts within 5 cycles then timeout 启动monit
sudo monit monit将监控指定的进程或服务并在它失败时自动重启。
确保替换my_service为你的服务名称并调整if failed和重启策略以符合你的需求。
7、总结
还有一种方法没有研究过用到再说 系统关机时systemed也好init也好会去关掉所有运行进程说明系统对进程是一直监控状态的 ps -aux可以看到进程的运行状态init是个守护进程对僵死进程进行回收那么肯定有种方法可以重启进程 在rcS文件里是可以设置重启的具体怎么设置无非那几个文件inittabinit.drcS