Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.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
Macos 基于PID(OSX)的标准输出_Macos_Bash_Pid - Fatal编程技术网

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,但可能性不大。很难说到底发生了什么,因为您没有发布任何代码