基于PID(OSX)的标准输出

时间:2016-04-20 04:01:54

标签: macos bash pid

我使用许多单独的脚本处理许多文件。为了加快处理速度,我使用&将它们放在后台,但是由此我无法跟踪他们正在做什么(我无法看到输出)。

是否有一种基于PID获取输出的简单方法?我找到了一些基于fg [job number]的答案,但我无法从PID中找出工作号。

4 个答案:

答案 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 &>$outfileexec &>$outfifoexec &>$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