鱼C论坛

 找回密码
 立即注册
查看: 1599|回复: 8

linux下如何重启自身?

[复制链接]
发表于 2021-2-1 23:08:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

使用道具 举报

发表于 2021-2-2 09:59:09 | 显示全部楼层
os.system('shutdown -r')
这样可以吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-2 11:14:19 | 显示全部楼层
先用 ps 查到 正在运行的程序的 PID, 然后直接 kill 掉, 然后再启动这个程序. 思路大概就是这样, 在bat脚本写过, linux下没试过但是原理应该差不多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-2 11:30:12 | 显示全部楼层

直接重启机器啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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
[Unit]
Description=APP Daemon
After=network.target
Wants=network.target

[Service]
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


[Install]
WantedBy=multi-user.target

2)配置开机启动:
systemctl status app.service
systemctl enable app.service

3)即刻生效:
systemctl daemon-reload
systemctl start app.service
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

python调用bat或者vbs重启程序很简单,但是linux下似乎没有什么好解决方案,调用sh?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-2 11:40:29 | 显示全部楼层
看了一下你的需求, 我觉得你可以把"自动检测某个网页上面的版本信息 , 自动更新"这些操作放到另一个py脚本中, 当发现有更新时 kill 掉你的业务脚本, 然后执行更新, 最后再启动业务脚本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[0])

好像找到方法了,待有空用linux服务器试一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-2 12:10:48 | 显示全部楼层
suchocolate 发表于 2021-2-2 11:30
进程自己重启自己不太可能,都得靠另外一个进程重启,linux下就是init或systemd。
  • 如果是低版本低于c ...

  • centos 7.5
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

    GMT+8, 2025-1-16 16:06

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表