我使用许多单独的脚本处理许多文件。为了加快处理速度,我使用&
将它们放在后台,但是由此我无法跟踪他们正在做什么(我无法看到输出)。
是否有一种基于PID获取输出的简单方法?我找到了一些基于fg [job number]
的答案,但我无法从PID中找出工作号。
答案 0 :(得分:2)
后台脚本通常只会继续写入标准输出;如果你运行几个,他们都将倾销他们的输出相互混合。将它们转储到文件中。例如,使用$$
(当前进程ID)生成输出文件名并写入该文件。
outfile=process.$$.out
# ...
echo Output >$outfile
会写信给process.27422.out
。
答案 1 :(得分:2)
您可以考虑从screen
运行脚本,然后在需要时返回它们:
$ screen ./script.sh
To" detach"并保持脚本运行按 Control A 后跟 Control D
$ screen -ls
将列出您的屏幕会话
$ screen -r <screen pid number>
返回屏幕会话
上面的几个命令几乎没有触及屏幕的功能,所以查看有关它的手册页,你可能会对它所做的一切感到惊讶。
答案 2 :(得分:1)
其他用户的答案是正确的 - exec &>$outfile
或exec &>$outfifo
或exec &>$another_tty
是您需要做的事情&amp;是正确的方法。
但是,如果您已经启动了脚本,那么可以使用一种解决方法。我编写了这个脚本,将任何正在运行的进程的stdout
/ stderr
重定向到另一个文件/终端。
$ cat redirect_terminal
#!/bin/bash
PID=$1
stdout=$2
stderr=${3:-$2}
if [ -e "/proc/$PID" ]; then
gdb -q -n -p $PID <<EOF >/dev/null
p dup2(open("$stdout",1),1)
p dup2(open("$stderr",1),2)
detach
quit
EOF
else
echo No such PID : $PID
fi
样本用法:
./redirect_terminal 1234 /dev/pts/16
其中,
1234
是脚本进程的PID
/dev/pts/16
是另一个单独开放的终端。
请注意,此更新的stdout / stderr不会继承到该进程的已运行子级。
答案 3 :(得分:1)
考虑使用 GNU Parallel - 它可以通过homebrew
轻松安装在OSX上。它不仅会标记您的输出行,还会使您的CPU保持忙碌状态,并在上一个作业完成后立即安排另一个作业。您可以使用替换参数组成自己的标签。
假设您有20个名为file{10..20}.txt
的文件要处理:
parallel --tagstring "MyTag-{}" 'echo Start; echo Processing file {}; echo Done' ::: file*txt
MyTag-file15.txt Start
MyTag-file15.txt Processing file file15.txt
MyTag-file15.txt Done
MyTag-file16.txt Start
MyTag-file16.txt Processing file file16.txt
MyTag-file16.txt Done
MyTag-file17.txt Start
MyTag-file17.txt Processing file file17.txt
MyTag-file17.txt Done
MyTag-file18.txt Start
MyTag-file18.txt Processing file file18.txt
MyTag-file18.txt Done
MyTag-file14.txt Start
MyTag-file14.txt Processing file file14.txt
MyTag-file14.txt Done
MyTag-file13.txt Start
MyTag-file13.txt Processing file file13.txt
MyTag-file13.txt Done
MyTag-file12.txt Start
MyTag-file12.txt Processing file file12.txt
MyTag-file12.txt Done
MyTag-file19.txt Start
MyTag-file19.txt Processing file file19.txt
MyTag-file19.txt Done
MyTag-file20.txt Start
MyTag-file20.txt Processing file file20.txt
MyTag-file20.txt Done
MyTag-file11.txt Start
MyTag-file11.txt Processing file file11.txt
MyTag-file11.txt Done
MyTag-file10.txt Start
MyTag-file10.txt Processing file file10.txt
MyTag-file10.txt Done
如果您想按顺序输出,请使用parallel -k
保持输出顺序
如果您需要进度报告,请使用parallel --progress
如果您想要开始/结束工作的日志,请使用parallel --joblog log.txt
如果要并行运行32个作业,而不是每个CPU核心默认1个作业,请使用parallel -j 32
作业日志示例:
Seq Host Starttime JobRuntime Send Receive Exitval Signal Command
6 : 1461141901.514 0.005 0 38 0 0 echo Start; echo Processing file file15.txt; echo Done
7 : 1461141901.517 0.006 0 38 0 0 echo Start; echo Processing file file16.txt; echo Done
8 : 1461141901.519 0.006 0 38 0 0 echo Start; echo Processing file file17.txt; echo Done