gpt4 book ai didi

python - 通过 tee 将 stdout 重定向到文件时隐藏来自信号处理程序的日志

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:32:42 24 4
gpt4 key购买 nike

我有一个像这样的 python 程序:

import signal, time

def cleanup(*_):
print("cleanup")
# do stuff ...
exit(1)

# trap ctrl+c and hide the traceback message
signal.signal(signal.SIGINT, cleanup)

time.sleep(20)

我通过脚本运行程序:

#!/bin/bash

ARG1="$1"

trap cleanup INT TERM EXIT

cleanup() {
echo "\ncleaning up..."
killall -9 python >/dev/null 2>&1
killall -9 python3 >/dev/null 2>&1
# some more killing here ...
}

mystart() {
echo "starting..."
export PYTHONPATH=$(pwd)
python3 -u myfolder/myfile.py $ARG1 2>&1 | tee "myfolder/log.txt"
}

mystart &&
cleanup

我的问题是消息cleanup 既没有出现在终端上也没有出现在日志文件中。

但是,如果我在不重定向输出的情况下调用该程序,它会正常工作。

最佳答案

如果您不希望发生这种情况,请将 tee 置于后台,这样它就不会成为获取 SIGINT 的进程组的一部分。例如,使用 bash 4.1 或更新版本,您可以启动 process substitution使用提供句柄的自动分配的文件描述符:

#!/usr/bin/env bash
# ^^^^ NOT /bin/sh; >(...) is a bashism, likewise automatic FD allocation.

exec {log_fd}> >(exec tee log.txt) # run this first as a separate command
python3 -u myfile >&"$log_fd" 2>&1 # then here, ctrl+c will only impact Python...
exec {log_fd}>&- # here we close the file & thus the copy of tee.

当然,如果您将这三个命令放在一个脚本中,整个脚本就会成为您的前台进程,因此需要不同的技术。因此:

python3 -u myfile > >(trap '' INT; exec tee log.txt) 2>&1

关于python - 通过 tee 将 stdout 重定向到文件时隐藏来自信号处理程序的日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55678147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com