我正在使用
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 的理解在这里不是最佳的,我深表歉意——我相信我正在尝试做的事情是可能的,但我可能遗漏了一小块拼图。