问题总结
1、最关键的问题是找到程序没有自启的原因,网上也有很多关于自启失败的原因总结,但是找到自己的那一款最重要
建议:将打印结果重定向到log文件中,方便问题排查,确定是重启方法不对,还是重启时的一些客观因素导致的程序bug
nohup /xxxx/xx/python xxx.py >xxx.log 2>&1 &
我一直纠结于重启方法,结果是我的测试代码本身出现了问题。
由于我的代码中出现
cv.imshow()
导致在程序自启时,并没有图形化界面,报错如下:
qt.qpa.xcb: could not connect to display
2、确定ubuntu版本,16和18还是有差距的
3、参照了很多开机程序自启方案,最后按照这位大佬的方案成功了,其他大佬应该也都正确。这位大佬亲测正确。
https://www.r9it.com/20180613/ubuntu-18.04-auto-start.html
守护进程
方案1
流程:
先在/etc/crontab中写入开机时要启动,且要保持启动状态的脚本。如:/home/ubuntu路径下的project.sh
/home/ubuntu/project.sh的功能:监测进程是否启动,如果启动,打印启动,如果未启动,打印未启动并启动。
操作:
1、首先,执行下面命令,
echo '*/1 * * * * ubuntu /home/ubuntu/project.sh >> /home/ubuntu/project.log' >> /etc/crontab
即将*/1 * * * * ubuntu /home/ubuntu/project.sh >> /home/ubuntu/project.log
写入 /etc/crontab。
开机时系统会去/etc/crontab中读取自启的内容。
解读:
用户ubuntu一分钟检测一次/home/ubuntu/project.sh进程是否启动,并将检测结果写入/home/ubuntu/project.log
监测频率可改:https://www.runoob.com/linux/linux-comm-crontab.html可以修改时间间隔
用户名称可改:改为root或者自己的用户
脚本路径可改:改为自己的project.sh所在路径
2、然后,将project.sh放入指定位置,project.sh内容如下
#!/bin/bash
time=$(date +%Y%m%d%H%M%S)
echo "===================检测开始时间:"$time"==================="
#project检测
project=`ps -ef | grep main.py| grep -v grep | awk '{print $2}'` # 判断进程是否开启(main.py改为自己的启动程序名)
if [ -z "$project" ]
then
echo "#project未启动,执行启动命令"
cd /home/ubuntu # 进入启动程序main.py的目录下
nohup python main.py >main.log 2>&1 & # 启动进程并将打印日志写入main.log,nohup结合>main.log 2>&1 &为后台启动,并将日志写入main.log。可自适应修改
else
echo "#project正常运行"
fi
echo "=========================================================="
3、赋权限
sudo chmod 777 project.sh
4、等待自启
设置完毕,等待一分钟查看一下程序是否启动,如果没启动,先看看/home/ubuntu/main.log,判断程序本身是否正确,然后再看看/home/ubuntu/project.log,亲测是可以的。