【问题标题】:Have bash script execute multiple programs as separate processes让 bash 脚本将多个程序作为单独的进程执行
【发布时间】:2013-08-14 09:05:22
【问题描述】:

正如标题所暗示的,我如何编写一个 bash 脚本来执行例如 3 个不同的 Python 程序作为单独的进程?然后我是否能够访问这些进程中的每一个以查看正在登录到终端的内容?

编辑:再次感谢。我忘了提到我知道附加 & 但我不确定如何访问每个进程输出到终端的内容。例如,我可以在不同的选项卡上分别运行所有这 3 个程序,并能够看到正在输出的内容。

【问题讨论】:

    标签: python linux bash scripting


    【解决方案1】:

    您可以像这样在后台运行作业:

    command &
    

    这使您可以连续启动多个作业,而无需等待前一个作业完成。

    如果您像这样启动多个后台作业,它们将共享相同的stdout(和stderr),这意味着它们的输出可能会交错。比如下面的脚本:

    #!/bin/bash
    # countup.sh
    
    for i in `seq 3`; do
        echo $i
        sleep 1
    done
    

    在后台启动两次:

    ./countup.sh &
    ./countup.sh &
    

    您在终端中看到的内容将如下所示:

    1
    1
    2
    2
    3
    3
    

    但也可能是这样的:

    1
    2
    1
    3
    2
    3
    

    您可能不希望这样,因为很难确定哪个输出属于哪个作业。解决方案?将每个作业的 stdout(以及可选的 stderr)重定向到单独的文件。例如

    command > file &
    

    将仅重定向 stdout

    command > file 2>&1 &
    

    commandstdoutstderr 重定向到file,同时在后台运行commandThis page 很好地介绍了 Bash 中的重定向。您可以通过tailing 文件来查看命令的“实时”输出:

    tail -f file
    

    我建议使用 nohupscreen 运行后台作业,如 user2676075 所述,以便在您关闭终端会话后让您的作业继续运行,例如

    nohup command1 > file1 2>&1 &
    nohup command2 > file2 2>&1 &
    nohup command3 > file3 2>&1 &
    

    【讨论】:

      【解决方案2】:

      尝试类似:

      command1 2>&1 | tee commandlogs/command1.log ;
      command2 2>&1 | tee commandlogs/command2.log ; 
      command3 2>&1 | tee commandlogs/command3.log
      ...
      

      然后您可以在命令运行时跟踪文件。请记住,您可以通过在目录中并执行“tail *.log”来跟踪它们

      或者,您可以设置一个脚本来为每个命令生成一个屏幕:

      screen -S CMD1 -d -m command1 ;
      screen -S CMD2 -d -m command2 ;
      screen -S CMD3 -d -m command3
      ...
      

      然后稍后使用 screen --list 和 screen -r [屏幕名称] 重新连接到它们

      享受

      【讨论】:

        【解决方案3】:

        另一种选择是使用终端模拟器来运行这三个进程。如果您使用 X,则可以使用 xterm(或 rxvt 等)。

        xterm -e <program1> [arg] ... &
        xterm -e <program2> [arg] ... &
        xterm -e <program3> [arg] ... &
        

        取决于你想要什么。这种方法可以让您弹出终端窗口,以便您可以实时查看输出。您也可以将其与重定向结合使用以保存输出。

        【讨论】:

          猜你喜欢
          • 2013-10-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多