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

Python进程调用Shell脚本实现自终止与重启的问题

Fixing Self-Restart via Shell Script in Python Process

Alright, let's break down what's going on here and fix your issue. The core problem you're hitting is that when your Python process (A) launches the shell script via subprocess.Popen, the script runs in the same process group as process A. So when the script tries to kill process A, it often gets taken down with it before finishing the restart step. Here's how to fix this properly:

Step 1: Modify the Python Code to Launch the Script Safely

We need to make sure the shell script runs independently of process A's process group, so killing A doesn't terminate the script. We'll use start_new_session=True in subprocess.Popen and pass process A's PID to the script for accurate targeting:

import subprocess
import os

# Get the PID of the current Python process (process A)
current_pid = os.getpid()

# Launch the script in a new session to detach it from our process group
subprocess.Popen(["./script.sh", str(current_pid)], start_new_session=True)

# Exit the current process immediately to let the script handle the rest
exit()

Step 2: Update the Shell Script for Reliable Termination & Restart

Modify your script to accept the PID as an argument, wait for process A to fully terminate, run your custom operations, then restart the Python program:

#!/bin/bash
# Accept the target PID (process A) as the first argument
TARGET_PID=$1

# Only attempt to kill if the process is still running
if ps -p "$TARGET_PID" > /dev/null; then
    echo "Terminating process A (PID: $TARGET_PID)..."
    kill "$TARGET_PID"
    
    # Wait until the process is fully gone to avoid race conditions
    while ps -p "$TARGET_PID" > /dev/null; do
        sleep 0.5
    done
fi

# Execute your custom operations here
echo "Running post-termination tasks..."
# Replace with your actual commands, e.g.:
# rm /tmp/process_a_cache.log
# cp /path/to/config.ini /path/to/backups/config_$(date +%Y%m%d).ini

# Restart the Python program - replace with your actual launch command
echo "Restarting process A..."
python3 /path/to/your/python_program.py &

Key Explanations

  • start_new_session=True: This makes the shell script the leader of a new process session, detaching it from process A's group. When process A is killed, the script won't receive a SIGHUP signal and will continue running.
  • Passing the PID: Using the exact PID of process A avoids accidental termination of other processes (which can happen if you use pkill with a process name).
  • Waiting for termination: The while loop ensures we don't proceed to restart until process A has fully exited, preventing resource conflicts or duplicate processes.
  • 主动 exit() in Python: Instead of waiting for the script to kill process A, exiting immediately ensures the process terminates cleanly and lets the script take over without delays.

内容的提问来源于stack exchange,提问作者s ahmad ef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:49:23