如何通过 Python 中的子进程向 tar 发送 SIGUSR1 信号?

问题描述 投票:0回答:0

我正在使用

tar
模块执行一个
subprocess
过程,我发现了使用信号的能力 从中获取进度信息(发送到标准错误)。

$ tar -xpf archive.tar --totals=SIGUSR1 ./blah
$ pkill -SIGUSR1 tar  # separate terminal, session etc.

不幸的是,我无法在 Python 中成功地复制这个序列

import os
import subprocess
import signal
import time
import sys

# Define the command to execute
command = ["tar", sys.argv[2], "-xpf", "-C", sys.argv[1], "--totals=SIGUSR1"]

# Start the subprocess
print(' '.join(command))
process = subprocess.Popen(command, preexec_fn=os.setsid, stderr=subprocess.PIPE)

try:
    while True:
        # Ping the subprocess with SIGUSR1 signal
        process.send_signal(signal.SIGUSR1)
        # os.killpg(os.getpgid(process.pid), signal.SIGUSR1)
        # subprocess.Popen(["pkill", "-SIGUSR1", "tar"])

        print(process.stderr.readline().decode("utf-8").strip())
        # print(process.stdout.readline().decode("utf-8").strip())

        # Wait for a specified interval
        time.sleep(1.9)  # Adjust the interval as needed

except KeyboardInterrupt:
    # Handle Ctrl+C to gracefully terminate the script
    process.terminate()

# Wait for the subprocess to complete
process.wait()

您可以看到我通过

SIGUSR1
Popen.send_signal
向流程发送
os.killpg
信号的 3 种不同风格,并使用
pkill
打开一个
subprocess
流程。

如果我对操作系统和 Linux 的理解在这里不是最佳的,我深表歉意——我相信我正在尝试做的事情是可能的,但我可能遗漏了一小块拼图。

python subprocess signals tar
© www.soinside.com 2019 - 2024. All rights reserved.