Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.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
Bash GNU并行stderr与--files或sensible--results树_Bash_Io Redirection_Gnu Parallel - Fatal编程技术网

Bash GNU并行stderr与--files或sensible--results树

Bash GNU并行stderr与--files或sensible--results树,bash,io-redirection,gnu-parallel,Bash,Io Redirection,Gnu Parallel,我最近发现了GNUparallel,它已经非常有用了,但我不知道如何将所有输出转换成任何可用的结构。以下是我的问题: 我正在运行的命令需要几个小时或几天的时间,并产生大量输出到stdout和stderr,因此我想重定向所有输出 听起来,文件应该有用,对吧?但除非我疯了,否则我只会从那些文件中得到数据。stderr是否使用此选项转储 好的,结果如何?这可能好一点,但有两个问题: 命令很长:/path/to/command-a--blah/path/to/data/other/path{}。这使目

我最近发现了GNUparallel,它已经非常有用了,但我不知道如何将所有输出转换成任何可用的结构。以下是我的问题:

  • 我正在运行的命令需要几个小时或几天的时间,并产生大量输出到stdout和stderr,因此我想重定向所有输出
  • 听起来,文件应该有用,对吧?但除非我疯了,否则我只会从那些文件中得到数据。stderr是否使用此选项转储
  • 好的,结果如何?这可能好一点,但有两个问题:
  • 命令很长:/path/to/command-a--blah/path/to/data/other/path{}。这使目录名变得荒谬,而空格使尝试做任何事情都很痛苦(例如,“cat`find.-name stdout`”将不起作用)
  • STDUT和STDRR转到单独的文件,这通常是可以的,但是在这种情况下,错误消息有时会在其他输出的中间产生,并且试图把事情重新组合起来是一种痛苦。李>
那么:在parallel中有没有什么方法,也就是说,在使用--files或强制--results使用合理的目录名时,不必修改我的命令来获取stderr

编辑: 作为对评论的回应,我尝试:

find controlFiles/ -name "*.txt" | parallel --files --tmpdir logs --tagstr {/.} -j15 --joblog logs/joblog --eta /path/to/command --opt --opt2 /path/to/data /path/to/output {} > logs/logfiles.txt

其中前者丢失stderr,后者生成不可用的目录名

编辑2:
经过一系列的测试,我似乎不知何故把事情弄到了一个非常奇怪的状态。来自--results的目录结构应该以参数命名,但是我的目录结构使用了整个命令。当我尝试删除现有的logs目录并使用我认为相同的命令重新开始时,我得到了预期的行为。仍然不理想,但我肯定能接受

最明显的解决方案是在作业完成后重命名dir的长部分

cd resultdir/1/
rename 's:long/common/string/to/remove::' */2/*
另一个想法是使用新的.csv输出(可从20161222获得):

它将生成一个CSV文件,内容来自--joblog、参数、stdout和stderr。如果您想在R或LibreCalc中对其进行后期处理,这尤其方便

如果您喜欢混合stderr/stdout,只需将2>&1作为命令的一部分:

parallel '(echo joe; ls /doesnotexists {}) 2>&1' ::: bar > foo
从版本20170122,您可以:

parallel --results out/{/.} mycommand

我们可以看看您是如何调用parallel命令的吗?我认为当每个命令都生成输出页面时,CSV选项不会很好地工作,但是对于rename命令+1,我以前从未听说过!CSV输出正确处理换行符。只要有RAM将单个作业的输出保存在内存中,CSV输出就可以正常工作。
parallel '(echo joe; ls /doesnotexists {}) 2>&1' ::: bar > foo
parallel --results out/{/.} mycommand