Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 如何冲洗当前运行的所有管道?_Shell_Pipe - Fatal编程技术网

Shell 如何冲洗当前运行的所有管道?

Shell 如何冲洗当前运行的所有管道?,shell,pipe,Shell,Pipe,我有一些管道进程正在后台运行,已经运行了一天多了 $ cmd | cmd | cmd | cmd | cmd > file 是否可以刷新所有管道,以便查看文件中的当前状态?解决方案 编撰 #include <stdio.h> #include <unistd.h> #include <sys/errno.h> int main(int argc, char **argv){ fflush(NULL); if (!errno) sync();

我有一些管道进程正在后台运行,已经运行了一天多了

$ cmd | cmd | cmd | cmd | cmd > file
是否可以刷新所有管道,以便查看文件中的当前状态?

解决方案 编撰

#include <stdio.h>
#include <unistd.h>
#include <sys/errno.h>
int main(int argc, char **argv){
  fflush(NULL);
  if (!errno) sync();
  return errno;
}
#包括
#包括
#包括
int main(int argc,字符**argv){
fflush(空);
如果(!errno)sync();
返回errno;
}
比如说,
fflush
,但根据您的个人偏好和权限,它位于
~/bin
/opt/bin
/usr/local/bin
,请确保此命令位于您的路径中,并简单地使用它

讨论
这个(简单!)的东西在通常的工具集中并不存在,这表明它很少有用:一般来说,这会挫败操作系统的智能化尝试,并使事情变得缓慢。更糟糕的是,对于像您展示的那样的扩展管道,它可能会以“错误”的顺序刷新管道,而不会比以前更确定当前的进度。

最坏的情况是,在
fflush(3)
周围编写包装应该很简单。不知道如何在管道运行时执行此操作,但下一次,您可以使用
unbuffer
。这避免了管道之间的缓冲。检查此链接:不确定是否有效,但您是否尝试过
sync(1)
?@Shahbaz关于
sync(1)
的事情是它调用
sync(2)
,我的主页上写着“sync()函数强制将块缓冲缓存中的脏(修改过的)缓冲写入磁盘。”,这使得非磁盘文件不被刷新的可能性成为可能。@Shahbaz在查看了几个手册页后,我得出结论,您需要
fflush(3)
sync(2)
才能使其工作。linux
fflush(3)
页面上说“注意fflush()仅刷新C库提供的用户空间缓冲区。为确保数据物理存储在磁盘上,还必须刷新内核缓冲区,例如使用sync(2)或fsync(2)。“如果(!errno),则最好删除
。如果
fflush
在战争中期因任何原因失败,您可能仍然可以使用
sync
刷新数据。我可以看到它的用途,但是我需要缓存错误代码,并通过错误报告的方式执行更复杂的操作。塞雷波,如果你有兴趣看的话,请告诉我:我暂时不谈这件事。与其让代码更复杂,我是否可以从终端调用
sync
命令并获得同样的效果?