`watch -n 100 'sh script.sh >> /path/to/output/output.txt` 不写入output.txt?

`watch -n 100 'sh script.sh >> /path/to/output/output.txt` 不写入output.txt?

我目前正在执行以下操作:

watch -n 100 'sh script.sh >> /path/to/output/output.txt' &

它已经运行了 30 分钟(我可以使用 进行验证ps -ef | grep watch),但是没有写入任何内容/path/to/output/output.txt(该文件不存在)。script.sh执行打印到终端的命令,所以不应该将>>所有内容都定向到吗output.txt

答案1

假设

你的watch停了。它在启动解释 的 shell 之前就被停止了sh script.sh >> /path/to/output/output.txt。重定向尚未发生,这就是文件不存在的原因。sh script.sh尚未开始。


确认

您的交互式 shell 可能已经告诉您作业已停止;也许你错过了这条消息。调用jobs,您应该看到您的watchis Stopped


解释

停止的原因watch是它收到了 SIGTTOU。 SIGTTIN 和 SIGTTOU 是(默认情况下)停止尝试从终端读取或(分别)写入终端的后台进程(即不在前台进程组中的进程)的信号。通常,终端配置为不将 SIGTTOU 发送到尝试写入的后台进程(因此例如可以date &工作),但是如果后台进程尝试配置终端,那么无论如何它都会收到 SIGTTOU。整个机制可以防止后台进程窃取或篡改终端的输入。

碰巧watch尝试很早就配置终端。如果您watch在后台运行(watch … &就像您所做的那样),那么它将收到 SIGTTOU 并停止。如果你尝试bg这样做,它会再次被阻止。如果你尝试fg这样做,那么它将被放在前台,它将被允许与终端交互,它不会收到 SIGTTOU 并且它会工作。


结论

watch并不意味着在后台运行。


工作替代方案

使用一个简单的循环:

while sleep 100; do … done > … &

相关内容