我目前正在执行以下操作:
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
,您应该看到您的watch
is Stopped
。
解释
停止的原因watch
是它收到了 SIGTTOU。 SIGTTIN 和 SIGTTOU 是(默认情况下)停止尝试从终端读取或(分别)写入终端的后台进程(即不在前台进程组中的进程)的信号。通常,终端配置为不将 SIGTTOU 发送到尝试写入的后台进程(因此例如可以date &
工作),但是如果后台进程尝试配置终端,那么无论如何它都会收到 SIGTTOU。整个机制可以防止后台进程窃取或篡改终端的输入。
碰巧watch
尝试很早就配置终端。如果您watch
在后台运行(watch … &
就像您所做的那样),那么它将收到 SIGTTOU 并停止。如果你尝试bg
这样做,它会再次被阻止。如果你尝试fg
这样做,那么它将被放在前台,它将被允许与终端交互,它不会收到 SIGTTOU 并且它会工作。
结论
watch
并不意味着在后台运行。
工作替代方案
使用一个简单的循环:
while sleep 100; do … done > … &