11

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

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

4

3 回答 3

24

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

command &

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

如果您像这样启动多个后台作业,它们将共享相同的stdout(and 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 &

在后台运行时将同时重定向stdoutstderrfor commandto 。这个页面很好地介绍了 Bash 中的重定向。您可以通过ing 文件查看命令的“实时”输出:filecommandtail

tail -f file

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

nohup command1 > file1 2>&1 &
nohup command2 > file2 2>&1 &
nohup command3 > file3 2>&1 &
于 2013-08-12T22:04:53.663 回答
4

尝试类似:

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] 重新连接到它们

享受

于 2013-08-12T22:13:37.787 回答
1

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

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

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

于 2013-08-12T22:38:28.563 回答