linux下如何重启自身?
平时都用SSH连接,使用nohup python3 /usr/main.py &这样的命令后关闭掉,让它一直在后台运行,现在想做一个自动更新的功能,自动检测某个网页上面的版本信息,发现更新时则下载覆盖并重新启动,发现了一个问题,PY后台的程序,在linux下面不知道怎么重启? os.system('shutdown -r')这样可以吗 先用 ps 查到 正在运行的程序的 PID, 然后直接 kill 掉, 然后再启动这个程序. 思路大概就是这样, 在bat脚本写过, linux下没试过但是原理应该差不多 qiuyouzhi 发表于 2021-2-2 09:59
这样可以吗
直接重启机器啊{:10_277:} 本帖最后由 suchocolate 于 2021-2-2 12:11 编辑
进程自己重启自己不太可能,都得靠另外一个进程重启,linux下就是init或systemd。
[*]如果是低版本低于centos 6或ubuntu 1604,再写一个脚本,用于监控结果,重启/usr/main.py的进程。
[*]如果是高于上述版本,把脚本做成服务,交给systemd监控:
1)写配置:vi /etc/systemd/system/app.service
Description=APP Daemon
After=network.target
Wants=network.target
Type=simple
ExecStart=/usr/bin/python3 /usr/main.py # a.把main.py改成如果取不到结果就退出,systemd会自动帮你再起启动
#ExecStop=/bin/kill -9 $(/bin/cat /run/main.pid) # 可选的,人为的定义systemctl stop app时使用的命令。想用需要再改一下main.py,输出main.py的pid到这个文件,方便kill时用。用os模块的os.getpid()就行。不写也没关系,systemd能帮你停。
#ExecReload=/bin/kill -9 $(/bin/cat /run/main.pid) && /usr/binpython3 /usr/main.py # 同上可选
Restart=always
RestartSec=10s # 故障后,准备重启前等待的秒数
User=root
WantedBy=multi-user.target
2)配置开机启动:
systemctl status app.service
systemctl enable app.service
3)即刻生效:
systemctl daemon-reload
systemctl start app.service kishere 发表于 2021-2-2 11:14
先用 ps 查到 正在运行的程序的 PID, 然后直接 kill 掉, 然后再启动这个程序. 思路大概就是这样, 在bat脚本 ...
python调用bat或者vbs重启程序很简单,但是linux下似乎没有什么好解决方案,调用sh? 看了一下你的需求, 我觉得你可以把"自动检测某个网页上面的版本信息 , 自动更新"这些操作放到另一个py脚本中, 当发现有更新时 kill 掉你的业务脚本, 然后执行更新, 最后再启动业务脚本 import time
import sys
import os
print("2秒后,程序将重启...")
time.sleep(2)
python = sys.executable
os.execl(python,'python.exe', sys.argv)
好像找到方法了,待有空用linux服务器试一下 suchocolate 发表于 2021-2-2 11:30
进程自己重启自己不太可能,都得靠另外一个进程重启,linux下就是init或systemd。
[*]如果是低版本低于c ...
centos 7.5
页:
[1]