让bash脚本作为单独的进程执行多个程序

时间:2013-08-12 22:01:50

标签: python linux bash scripting

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

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

3 个答案:

答案 0 :(得分:11)

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

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 &
在后台运行stdout时,

会将stderr的{​​{1}}和command重定向到fileThis page对Bash中的重定向有很好的介绍。您可以通过command文件“实时”查看命令的输出:

tail

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

tail -f file

答案 1 :(得分:3)

尝试类似:

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 [screen name]

重新连接到它们

享受

答案 2 :(得分:0)

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

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

取决于你想要什么。此方法允许您弹出终端窗口,以便您可以实时查看输出。您也可以将它与重定向结合起来以保存输出。