GNU parallel stderr with --files or sensible --results tree
GNU parallel stderr with --files or sensible --results tree
我最近发现了 GNU parallel,它已经非常有用了,但我不知道如何将我的所有输出放入任何类型的可用结构中。这是我的问题:
- 我 运行 的命令需要几个小时或几天,并且会向 stdout 和 stderr 产生大量输出,所以我想重定向所有输出
- 听起来 --files 应该可以,对吧?但除非我疯了,否则我只会从这些文件中获取标准输出。 stderr 只是用这个选项转储了吗???
- 好的,--results 怎么样?这可能好一点,但有两个问题:
- 命令很长:/path/to/command -a --blah /path/to/data /another/path {} 。这使目录名称变得荒谬,空格使尝试做任何事情都变得很痛苦(例如 'cat `find . -name stdout`' 将不起作用)
- stdout 和 stderr 转到单独的文件,这通常没问题,但在这种情况下,错误消息有时会在其他输出的中间产生,并且试图将它们拼凑起来是一件痛苦的事情。
所以:有没有什么办法 并行,即不必修改我的命令 来在使用 --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
和
find controlFiles/ -name "*.txt" | parallel --files --results logs --tagstr {/.} -j15 --joblog logs/joblog --eta /path/to/command --opt --opt2 /path/to/data /path/to/output {} > logs/logfiles.txt
其中前者丢失 stderr 而后者产生不可用的目录名
编辑2:
经过更多测试后,我似乎以某种方式让事情进入了 really 奇怪的状态。 --results 中的目录结构应该以参数命名,但不知何故我使用了整个命令。当我尝试删除现有的日志目录并使用我认为是相同的命令重新开始时,我得到了预期的行为。仍然不理想,但我当然可以忍受。
最明显的解决方案是在作业完成后重命名目录的长部分。
cd resultdir/1/
rename 's:long/common/string/to/remove::' */2/*
另一个想法是使用新的 .csv 输出(从 20161222 开始可用):
parallel --results foo.csv ...
这将生成一个 CSV 文件,其中包含来自 --joblog 的内容、参数、标准输出和标准错误。如果您想 post 在 R 或 LibreCalc 中处理它,这将特别方便。
如果您喜欢混合 stderr/stdout,只需让 2>&1 成为您的命令的一部分:
parallel '(echo joe; ls /doesnotexists {}) 2>&1' ::: bar > foo
从版本 20170122 开始,您可以:
parallel --results out/{/.} mycommand
我最近发现了 GNU parallel,它已经非常有用了,但我不知道如何将我的所有输出放入任何类型的可用结构中。这是我的问题:
- 我 运行 的命令需要几个小时或几天,并且会向 stdout 和 stderr 产生大量输出,所以我想重定向所有输出
- 听起来 --files 应该可以,对吧?但除非我疯了,否则我只会从这些文件中获取标准输出。 stderr 只是用这个选项转储了吗???
- 好的,--results 怎么样?这可能好一点,但有两个问题:
- 命令很长:/path/to/command -a --blah /path/to/data /another/path {} 。这使目录名称变得荒谬,空格使尝试做任何事情都变得很痛苦(例如 'cat `find . -name stdout`' 将不起作用)
- stdout 和 stderr 转到单独的文件,这通常没问题,但在这种情况下,错误消息有时会在其他输出的中间产生,并且试图将它们拼凑起来是一件痛苦的事情。
所以:有没有什么办法 并行,即不必修改我的命令 来在使用 --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
和
find controlFiles/ -name "*.txt" | parallel --files --results logs --tagstr {/.} -j15 --joblog logs/joblog --eta /path/to/command --opt --opt2 /path/to/data /path/to/output {} > logs/logfiles.txt
其中前者丢失 stderr 而后者产生不可用的目录名
编辑2: 经过更多测试后,我似乎以某种方式让事情进入了 really 奇怪的状态。 --results 中的目录结构应该以参数命名,但不知何故我使用了整个命令。当我尝试删除现有的日志目录并使用我认为是相同的命令重新开始时,我得到了预期的行为。仍然不理想,但我当然可以忍受。
最明显的解决方案是在作业完成后重命名目录的长部分。
cd resultdir/1/
rename 's:long/common/string/to/remove::' */2/*
另一个想法是使用新的 .csv 输出(从 20161222 开始可用):
parallel --results foo.csv ...
这将生成一个 CSV 文件,其中包含来自 --joblog 的内容、参数、标准输出和标准错误。如果您想 post 在 R 或 LibreCalc 中处理它,这将特别方便。
如果您喜欢混合 stderr/stdout,只需让 2>&1 成为您的命令的一部分:
parallel '(echo joe; ls /doesnotexists {}) 2>&1' ::: bar > foo
从版本 20170122 开始,您可以:
parallel --results out/{/.} mycommand