You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Bash终端修改运行中Python脚本的Status变量

跨终端控制Python程序的几种实现方案

方案1:文件状态标记法(最简单易实现)

通过一个文件作为运行状态的标记,程序循环检查该文件是否存在,外部终端通过创建/删除文件来控制程序启停。

修改后的Python代码:

import os
import sys
import time

# 定义全局可访问的状态文件路径
STATUS_FLAG = "/tmp/program_run_flag"

def toggle_program():
    if os.path.exists(STATUS_FLAG):
        os.remove(STATUS_FLAG)
        print("程序将停止运行")
    else:
        print("程序未在运行,请先启动程序")

def main():
    # 处理toggle命令参数
    if len(sys.argv) > 1 and sys.argv[1] == "toggle":
        toggle_program()
        return
    
    # 启动程序:创建状态标记文件
    with open(STATUS_FLAG, 'w') as f:
        f.write("1")
    
    try:
        # 循环检查标记文件是否存在
        while os.path.exists(STATUS_FLAG):
            print("Program is Running")
            time.sleep(1)  # 避免输出刷屏,添加延迟
    finally:
        print("Program is not Running")
        # 清理标记文件(可选)
        if os.path.exists(STATUS_FLAG):
            os.remove(STATUS_FLAG)

if __name__ == "__main__":
    main()

使用方式:

  1. 第一个终端启动程序:
    python pathtocode/code.py
    
  2. 第二个终端执行toggle命令停止程序:
    python pathtocode/code.py toggle
    

方案2:信号处理法(更高效)

利用Linux系统的进程信号机制,让程序捕获指定信号后修改运行状态,外部终端通过向进程发送信号实现控制。

修改后的Python代码:

import signal
import sys
import time
import os
import subprocess

def get_program_pid():
    # 查找当前程序的进程PID(精确匹配脚本路径可避免误杀)
    cmd = ["pgrep", "-f", f"{sys.executable} {__file__}"]
    result = subprocess.run(cmd, capture_output=True, text=True)
    if result.returncode == 0:
        return int(result.stdout.strip())
    return None

def toggle_program():
    pid = get_program_pid()
    if pid:
        # 发送SIGUSR1自定义信号给进程
        os.kill(pid, signal.SIGUSR1)
        print("已发送停止信号给程序")
    else:
        print("程序未在运行")

def main():
    if len(sys.argv) > 1 and sys.argv[1] == "toggle":
        toggle_program()
        return
    
    running = True

    # 定义信号处理函数:收到信号后修改运行状态
    def stop_handler(signum, frame):
        nonlocal running
        running = False
        print("\n收到停止信号")

    # 注册SIGUSR1信号的处理逻辑
    signal.signal(signal.SIGUSR1, stop_handler)

    try:
        while running:
            print("Program is Running")
            time.sleep(1)
    finally:
        print("Program is not Running")

if __name__ == "__main__":
    main()

使用方式:

  1. 第一个终端启动程序:
    python pathtocode/code.py
    
  2. 第二个终端执行toggle命令:
    python pathtocode/code.py toggle
    

方案对比

  • 文件标记法:实现门槛低,无需了解进程信号,适合快速开发;缺点是依赖文件系统,极端情况下可能出现文件残留。
  • 信号处理法:系统级进程通信方式,性能更高,逻辑更严谨;需要对Linux信号机制有基础了解。

内容的提问来源于stack exchange,提问作者IloveMath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 07:15:34