python程序 自动启动运行并防止启动两个以上进程

28 篇文章 3 订阅
19 篇文章 0 订阅

汗,近期需要运行一个python程序,但是受限于网络环境等具体因素,会偶尔中断崩溃。
希望在程序中断运行之后,自动重新启动,所以采用的是crontab机制:

*/5 * * * * python3 /test.py > /test.log

上述命令表示每五分钟执行一次 python3 /test.py > test.log 命令。但是与此同时,也不希望同时运行两个python3 /test.py命令。因此需要在源代码里面进行判断:

 

import psutil
import sys
import os

def checkProcess(processName):
    ps1=psutil.pids()
    curps=os.getpid()
    print("current pid = "+str(curps))
    for pid in ps1:
        cmdline=str(psutil.Process(pid).cmdline())
        print(cmdline)
        if cmdline.find(processName)>=0:
            if pid!=curps and pid!=(curps-1):
                print("This is the second process "+str(pid))
                return 1
    return 0

if checkProcess("/test.py")==1:
    print("There is a process for test.py")
    sys.exit(0)

需要注意的是: 

if pid!=curps and pid!=(curps-1):  一开始采用的是 
if pid!=curps :

结果总是自动退出。后来发现,采用crontab 方式启动,会显示两条:

/bin/bash -c python3 test.py

python3 test.py

因此需要修改上述语句。

至此已经达到了目标。ok

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过创建一个systemd服务来让一个Python程序在树莓派启动自动运行,并且一直在终端上运行。下面是具体步骤: 1. 编写Python程序 首先,你需要编写一个Python程序。在程序中,确保在程序的结尾没有调用input()或者类似阻塞程序结束的函数。 例如,这里有一个简单的Python程序示例: ```python #!/usr/bin/env python3 print("Hello World!") ``` 2. 创建systemd服务文件 在树莓派上创建一个systemd服务,可以使你的程序启动自动运行。创建一个名为`my_program.service`的文件,将以下内容复制到文件中: ```bash [Unit] Description=My Program [Service] ExecStart=/usr/bin/python3 /path/to/your/program.py WorkingDirectory=/path/to/your/program/directory StandardOutput=inherit StandardError=inherit Restart=always User=pi [Install] WantedBy=multi-user.target ``` 在 `ExecStart` 中指定你的Python程序路径,在 `WorkingDirectory` 中指定程序所在的目录。`StandardOutput` 和 `StandardError` 都设置为 `inherit`,这样服务的输出将会在终端上显示。`Restart` 设置为 `always`,这样当程序异常关闭时,systemd会自动重启程序。`User` 设置为 `pi`,这样服务将以 `pi` 用户的身份运行。 3. 将服务文件复制到systemd目录 将服务文件复制到 `/etc/systemd/system` 目录下: ```bash sudo cp my_program.service /etc/systemd/system/ ``` 4. 重新加载systemd配置 重新加载systemd配置,使得新的服务文件生效: ```bash sudo systemctl daemon-reload ``` 5. 启动服务 启动你的服务并检查运行状态: ```bash sudo systemctl start my_program.service sudo systemctl status my_program.service ``` 如果一切正常,你的程序应该已经在终端上运行了。 6. 设置服务开机自启动 如果你希望你的程序在树莓派启动自动运行,你需要将服务设置为开机自启动: ```bash sudo systemctl enable my_program.service ``` 现在,每次你启动树莓派,你的程序都会自动运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值