我有一个小脚本,crontab每天使用以下命令调用它:
/homedir/MyScript &> some_log.log
Run Code Online (Sandbox Code Playgroud)
此方法的问题是some_log.log仅在MyScript完成后创建.我希望在程序运行时将程序的输出刷新到文件中,这样我就能做到这样的事情
tail -f some_log.log
Run Code Online (Sandbox Code Playgroud)
并跟踪进度等
Mar*_*sch 69
我在这里找到了解决方案.使用OP的例子,你基本上运行
nohup
然后在每行输出后刷新缓冲区.我经常把它与nohup
远程机器上的长作业结合起来.
nohup
这样,当您注销时,您的进程不会被取消.
Chr*_*odd 27
bash本身永远不会将任何输出写入您的日志文件.相反,它作为脚本的一部分调用的命令将分别编写输出并在它们感觉到时刷新.所以你的问题实际上是如何强制bash脚本中的命令刷新,这取决于它们是什么.
小智 23
__CODE__
关键是-f.从man脚本引用:
Run Code Online (Sandbox Code Playgroud)script -c <PROGRAM> -f OUTPUT.txt
在后台运行:
-f, --flush
Flush output after each write. This is nice for telecooperation: one person
does 'mkfifo foo; script -f foo', and another can supervise real-time what is
being done using 'cat foo'.
Run Code Online (Sandbox Code Playgroud)
您可以使用tee
写入文件而无需刷新.
/homedir/MyScript 2>&1 | tee some_log.log > /dev/null
Run Code Online (Sandbox Code Playgroud)
这不是 的函数bash
,因为 shell 所做的只是打开相关文件,然后将文件描述符作为脚本的标准输出传递。您需要做的是确保比当前更频繁地从脚本中刷新输出。
例如,在 Perl 中,这可以通过设置来完成:
$| = 1;
Run Code Online (Sandbox Code Playgroud)
有关详细信息,请参阅perlvar 。
这有帮助吗?
tail -f access.log | stdbuf -oL cut -d ' ' -f1 | uniq
Run Code Online (Sandbox Code Playgroud)
这将立即使用stdbuf 实用程序显示 access.log 中的唯一条目。
归档时间: |
|
查看次数: |
89592 次 |
最近记录: |