通过shell脚本运行多个后台进程

时间:2013-12-04 05:56:29

标签: linux bash shell background-process

我是shell脚本的新手,所以请原谅我缺乏知识。

我的目标是在后台运行两个服务器server1server2,然后通过我的shell脚本运行python脚本scriptRun

第1步:

  • 启动server1(使其在后台运行)

  • 在此服务器上运行一些命令(这​​是自定义命令)

步骤2:

  • 启动server2

步骤3:

  • 运行我的python脚本并在启动server1和server2之后在终端上显示其输出

我的shell脚本如下所示:

echo "Launching server1"
java StartServer1.jar && (serverCommand1 && serverCommand2) &

echo "Launching server2"
java StartServer2.jar &&

echo "Running script"
python scriptRun.py

此脚本根本不起作用。 我尝试删除serverCommand1和serverCommand2,这可行,但python脚本不等待server2启动。

终端也显示server1和server2的输出,而不是python脚本的输出。

我的问题是如何在后台运行多个进程并运行另一个依赖于先前进程的进程?

2 个答案:

答案 0 :(得分:3)

脚本中的&&似乎有点混乱。记录:

  • 在命令之后放置一个&以在后台运行它
  • &&用于链接多个命令,如果成功,例如cmd1 && cmd2将执行cmd1,并且仅当它成功退出时,它才会执行cmd2。这两个命令都将在前台运行,这里根本没有背景。

也许你想做这样的事情:

echo "Launching server1"
java StartServer1.jar >server1.log 2>server1.err
sleep 5  # give some time for the server to come up

serverCommand1
serverCommand2

echo "Launching server2"
java StartServer2.jar >server2.log 2>server2.err
sleep 5  # give some time for the server to come up

echo "Running script"
python scriptRun.py

实际上,如果您能够检测到服务器已准备好并对此作出反应,那么最好不要在一段固定的时间内睡觉。例如,在日志中,可能会有一条消息指示服务器已准备就绪,让我们说一条消息“READY”。然后你可以做这样的事情:

echo "Launching server1"
java StartServer1.jar >server1.log 2>server1.err
while :; do sleep 5; grep -q READY server1.log && break; done

那是一个无限循环,在每次睡眠中它都会睡5秒并检查日志是否包含“READY”文本。如果是,它结束循环。你可以想出一个适合你需求的变体。

答案 1 :(得分:1)

在执行python脚本之前,您需要wait才能完成后台进程。此外,如果您想忽略这些内容,请将STDOUTSTDERR从java进程重定向到/dev/null

echo "Launching server1"
java StartServer1.jar >/dev/null 2>&1 &

echo "Launching server2"
java StartServer2.jar >/dev/null 2>&1 &

wait     # wait for the background processes to complete

echo "Running script"
python scriptRun.py

(我不确定您的服务器命令是如何工作的,但是如果您需要向它发出命令,则在启动server1后可能需要wait。)