我写了一个简单的包装脚本,用于在命令失败时重复执行,名为retry.py。然而,由于我想要看到子命令的输出,我不得不使用一些pty技巧。这对像rsync这样的程序运行良好,但是像scp这样的其他程序应用了额外的测试来显示诸如进度表之类的内容。
scp代码具有广泛的测试,大致如下:
scp代码具有广泛的测试,大致如下:
getpgrp() == tcgetpgrp(STDOUT_FILENO);
当我运行包装脚本时,它会失败。如您所见,我的简单tty_test.c测试用例:
./tty_tests
isatty reports 1
pgrps are 13619 and 13619
并且:
./retry.py -v -- ./tty_tests
command is ['./tty_tests']
isatty reports 1
pgrps are 13614 and -1
child finished: rc = 0
Ran command 1 times
我尝试过使用tcsetpgrp(),但在pty fd上会变成IOCTL,导致ptys出现-EINVAL错误。如果可能的话,我更喜欢继续使用Python subprocess机制,否则是否需要手动fork/execve?
become_tty_fg
函数在末尾添加os.close(tty)
可以稍微改进一下。否则,文件描述符tty
仍然会保持打开状态,尽管在当前代码中这并不重要,但该函数可能会在其他地方使用。 - Pavel Shishpor