a3n*_*3nm 95 bash shell-script background-process stdout stdin
我有一个程序可以生成有用的信息,stdout但也可以从stdin. 我想将其标准输出重定向到一个文件,而不在标准输入上提供任何内容。到目前为止,很好:我可以做到:
program > output
Run Code Online (Sandbox Code Playgroud)
并且不要在 tty 中做任何事情。
但是,问题是我想在后台执行此操作。如果我做:
program > output &
Run Code Online (Sandbox Code Playgroud)
程序将被挂起(“挂起(tty 输入)”)。
如果我做:
program < /dev/null > output &
Run Code Online (Sandbox Code Playgroud)
程序立即终止,因为它到达 EOF。
似乎我需要的是将program某些内容导入到无限期不执行任何操作且不读取的内容中stdin。以下方法有效:
while true; do sleep 100; done | program > output &
mkfifo fifo && cat fifo | program > output &
tail -f /dev/null | program > output &
Run Code Online (Sandbox Code Playgroud)
然而,这一切都非常难看。有有是一种优雅的方式,使用标准的Unix工具,以“什么都不做,无限期”(意译man true)。我怎么能做到这一点?(我这里优雅的主要标准:没有临时文件;没有忙碌等待或定期唤醒;没有异国情调的实用程序;尽可能短。)
P.T*_*.T. 93
我不认为你会变得比
tail -f /dev/null
Run Code Online (Sandbox Code Playgroud)
你已经建议了(假设这在内部使用 inotify,应该没有轮询或唤醒,所以除了看起来很奇怪,它应该足够了)。
您需要一个可以无限期运行的实用程序,将保持其标准输出打开,但实际上不会向标准输出写入任何内容,并且在标准输入关闭时也不会退出。类似的东西yes实际上写入标准输出。 cat将在其 stdin 关闭时退出(或者您重新定向到它的任何内容已完成)。我认为sleep 1000000000d可能有效,但tail显然更好。我的 Debian 盒子有一个tailf稍微缩短命令的命令。
采取不同的策略,在 下运行程序怎么样screen?
Zaz*_*Zaz 53
sleep infinity 是我所知道的最清晰的解决方案。
您可以使用infinity,因为sleep接受一个浮点数*,这可能是十进制,十六进制,无穷大或NaN的,根据man strtod。
* 这不是 POSIX 标准的一部分,因此不像tail -f /dev/null. 但是,它在 GNU coreutils (Linux) 和 BSD(在 Mac 上使用)中受支持(显然在较新版本的 Mac 上不受支持——见评论)。
Rob*_*Rob 20
sleep 2147483647 | program > output &
Run Code Online (Sandbox Code Playgroud)
是的,2^31-1是一个有限数字,它不会永远运行,但是当睡眠最终超时时,我会给你 1000 美元。(提示:到那时我们中的一个人会死。)
Sté*_*las 17
在支持它们的 shell(ksh、zsh、bash4)中,您可以program作为一个co-process 开始。
ksh: program > output |&zsh,bash:coproc program > output它program在后台开始,其输入从pipe. 管子的另一端对壳敞开。
这种方法的三个好处
program死亡时退出脚本(用于wait等待)program将终止(eof如果 shell 退出,则进入其标准输入)。PSk*_*cik 10
您可以创建一个二进制文件来执行此操作:
$ echo 'int main(){ pause(); }' > pause.c; make pause
Run Code Online (Sandbox Code Playgroud)
这是使用标准 Unix 实用程序的另一个建议,即“无限期地什么都不做”。
sh -c 'kill -STOP $$' | program > output
Run Code Online (Sandbox Code Playgroud)
这会启动一个立即发送的 shell SIGSTOP,从而暂停进程。这用作程序的“输入”。的补充SIGSTOP是SIGCONT,也就是说,如果您知道外壳程序的 PID 为 12345,您可以kill -CONT 12345让它继续运行。
| 归档时间: |
|
| 查看次数: |
45980 次 |
| 最近记录: |