Macos 基于PID(OSX)的标准输出
我正在使用许多单独的脚本处理许多文件。为了加快处理速度,我使用Macos 基于PID(OSX)的标准输出,macos,bash,pid,Macos,Bash,Pid,我正在使用许多单独的脚本处理许多文件。为了加快处理速度,我使用&将它们放在后台,但是这样我就失去了跟踪它们正在做什么的能力(我看不到输出) 是否有一种基于PID的简单输出方法?我找到了一些基于fg[job number]的答案,但我无法从PID中找出job number。后台脚本通常只会继续写入标准输出;如果您运行多个,它们都将相互混合输出。将它们转储到一个文件中。例如,使用$(当前进程ID)生成输出文件名并写入该文件 outfile=process.$$.out # ... echo Outp
&
将它们放在后台,但是这样我就失去了跟踪它们正在做什么的能力(我看不到输出)
是否有一种基于PID的简单输出方法?我找到了一些基于
fg[job number]
的答案,但我无法从PID中找出job number。后台脚本通常只会继续写入标准输出;如果您运行多个,它们都将相互混合输出。将它们转储到一个文件中。例如,使用$
(当前进程ID)生成输出文件名并写入该文件
outfile=process.$$.out
# ...
echo Output >$outfile
将写入,比如说,
进程.27422.out
后台脚本通常只会继续写入标准输出;如果您运行多个,它们都将相互混合输出。将它们转储到一个文件中。例如,使用$
(当前进程ID)生成输出文件名并写入该文件
outfile=process.$$.out
# ...
echo Output >$outfile
将写入,例如,“代码>进程。27422。out < /c> > /p> < p>您可以考虑从<代码>屏幕<代码>中运行脚本。然后,只要需要,就返回到它们:
$ screen ./script.sh
要“分离”并保持脚本运行,请按ControlA,然后按ControlD
将列出您的屏幕会话
$ screen -r <screen pid number>
$screen-r
返回到屏幕会话
上面的几个命令几乎不能触及屏幕的能力,所以检查一下它的人页,你可能会对它所能做的一切感到惊讶。
< P>你可以考虑从<代码>屏幕<代码>运行你的脚本。$ screen ./script.sh
要“分离”并保持脚本运行,请按ControlA,然后按ControlD
将列出您的屏幕会话
$ screen -r <screen pid number>
$screen-r
返回到屏幕会话
上面的几个命令几乎没有涉及到screen所具有的功能,因此请查看有关它的手册页,您可能会对它所能做的一切感到惊讶。其他用户的回答是正确的-
exec&>$outfile
或exec&>$outfifo
或exec&>$other\u tty
是您需要做的事情,也是正确的方法
但是,如果您已经启动了脚本,那么您可以使用一种变通方法。我编写这个脚本是为了将任何正在运行的进程的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
其中,1234
是脚本进程的PID。/dev/pts/16
是另一个单独打开的终端
请注意,此更新的stdout/stderr不会继承给该进程的已运行子进程。其他用户的回答是正确的-
exec&>$outfile
或exec&>$outfifo
或exec&>$other\u tty
是您需要做的事情,也是正确的方法
但是,如果您已经启动了脚本,那么您可以使用一种变通方法。我编写这个脚本是为了将任何正在运行的进程的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
其中,1234
是脚本进程的PID。/dev/pts/16
是另一个单独打开的终端
请注意,此更新的stdout/stderr将不会继承给该进程已经运行的子进程。考虑使用GNU Parallel-它可以通过
自制
轻松安装在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-j32
作业日志示例:
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
考虑使用GNU Parallel——它可以通过自制轻松安装在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-j32
作业日志示例:
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
嗯。有趣的是,我没有看到混合输出(即使这也是我所期望的)。但是,我可以从一个更新的日志中看到脚本正在运行。。。。另外,我很沮丧,因为我看不到处理过的文件(但是如果我按ctrl+C,那么处理过的文件就会出现…)。这是否表明我在脚本中遇到了一些问题?请注意,除非您采取措施确保每次都是一个不同的进程执行此操作(例如,子shell),否则这些进程都将写入同一个文件,这并不是我们想要的。@JonathanLeffler:两个后台进程肯定是不同的进程,不是吗?如果它们不同时运行,不确定它们是否会有不同的PID,但可能性不大。很难说到底发生了什么,因为您没有发布任何代码