正如标题所示,我如何编写一个bash脚本,例如将3个不同的Python程序作为单独的进程执行?然后我能够访问每个进程以查看登录到终端的内容吗?
编辑:再次感谢。我忘了提到我知道附加&
但我不知道如何访问每个进程输出到终端的内容。例如,我可以在不同的选项卡上分别运行所有这三个程序,并能够看到输出的内容。
答案 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
重定向到file
。 This page对Bash中的重定向有很好的介绍。您可以通过command
文件“实时”查看命令的输出:
tail
我建议您使用nohup或screen作为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] ... &
取决于你想要什么。此方法允许您弹出终端窗口,以便您可以实时查看输出。您也可以将它与重定向结合起来以保存输出。