我需要一种方法来使进程永远保持某个文件打开。这是我到目前为止的一个例子:
sleep 1000 > myfile &
它工作了一千秒,但实际上并不想做一些复杂的睡眠/循环语句。 This post建议cat
与sleep
无限相同。所以我尝试了这个:
cat > myfile &
它几乎看起来像是一个错误不是吗?它似乎从命令行工作,但在脚本中文件连接没有保持打开状态。还有其他想法吗?
答案 0 :(得分:15)
您也可以使用bash打开其中一个文件描述符,而不是使用后台进程:
exec 5>myfile
(此处exec
的特殊用法允许更改当前文件描述符重定向 - 有关详细信息,请参阅man bash
。这将打开文件描述符5到“myfile”(如果你不想清空文件,请使用>>
。)
稍后您可以使用以下方法再次关闭该文件:
exec 5>&-
(其中一个可能的缺点是FD会在此期间由shell运行的每个程序继承。大多数情况下这是无害的 - 例如,您的grep
和sed
通常会忽略额外的FD - 但在某些情况下它可能会很烦人,特别是如果你产生任何留在那里的进程(因为它们会保持FD打开)。
答案 1 :(得分:7)
cat>myfile&
的工作原因是因为它将标准输入重定向到文件中。
如果你用&符号(在后台)启动它,它将不会得到任何输入,包括文件结束,这意味着它将永远等待并且不会对输出文件打印任何内容。
使用此命令可以获得相同的效果,除非依赖于标准输入(后者是使其在脚本中不起作用的原因):
tail -f /dev/null > myfile &
答案 2 :(得分:1)
在终端中运行的cat > myfile &
问题与未作为脚本一部分运行的问题:在非交互式shell中,后台stdin
的{{1}}被隐式重定向到{{1 }}。
因此,脚本中的command &
实际上会被转换为/dev/null
,会立即终止cat > myfile &
。
请参阅Shell命令语言&中的POSIX标准。 Asynchronous Lists:
cat </dev/null > myfile
cat
答案 3 :(得分:0)
tail -f myfile
此'跟随'文件,并输出对文件的任何更改。如果您不希望看到tail
的输出,请将输出重定向到/dev/null
或其他内容:
tail -f myfile > /dev/null
您可能需要使用--retry
选项,具体取决于您的具体情况。有关详细信息,请参阅man tail
。