tryhi 发表于 2021-2-1 23:08:05

linux下如何重启自身?

平时都用SSH连接,使用nohup python3 /usr/main.py &这样的命令后关闭掉,让它一直在后台运行,现在想做一个自动更新的功能,自动检测某个网页上面的版本信息,发现更新时则下载覆盖并重新启动,发现了一个问题,PY后台的程序,在linux下面不知道怎么重启?

qiuyouzhi 发表于 2021-2-2 09:59:09

os.system('shutdown -r')
这样可以吗

kishere 发表于 2021-2-2 11:14:19

先用 ps 查到 正在运行的程序的 PID, 然后直接 kill 掉, 然后再启动这个程序. 思路大概就是这样, 在bat脚本写过, linux下没试过但是原理应该差不多

tryhi 发表于 2021-2-2 11:30:12

qiuyouzhi 发表于 2021-2-2 09:59
这样可以吗

直接重启机器啊{:10_277:}

suchocolate 发表于 2021-2-2 11:30:40

本帖最后由 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

tryhi 发表于 2021-2-2 11:31:08

kishere 发表于 2021-2-2 11:14
先用 ps 查到 正在运行的程序的 PID, 然后直接 kill 掉, 然后再启动这个程序. 思路大概就是这样, 在bat脚本 ...

python调用bat或者vbs重启程序很简单,但是linux下似乎没有什么好解决方案,调用sh?

kishere 发表于 2021-2-2 11:40:29

看了一下你的需求, 我觉得你可以把"自动检测某个网页上面的版本信息 , 自动更新"这些操作放到另一个py脚本中, 当发现有更新时 kill 掉你的业务脚本, 然后执行更新, 最后再启动业务脚本

tryhi 发表于 2021-2-2 12:07:54

import time
import sys
import os
print("2秒后,程序将重启...")
time.sleep(2)
python = sys.executable
os.execl(python,'python.exe', sys.argv)

好像找到方法了,待有空用linux服务器试一下

tryhi 发表于 2021-2-2 12:10:48

suchocolate 发表于 2021-2-2 11:30
进程自己重启自己不太可能,都得靠另外一个进程重启,linux下就是init或systemd。

[*]如果是低版本低于c ...

centos 7.5
页: [1]
查看完整版本: linux下如何重启自身?