我是shell脚本的新手,所以请原谅我缺乏知识。
我的目标是在后台运行两个服务器server1
和server2
,然后通过我的shell脚本运行python脚本scriptRun
。
第1步:
启动server1(使其在后台运行)
在此服务器上运行一些命令(这是自定义命令)
步骤2:
步骤3:
我的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脚本的输出。
我的问题是如何在后台运行多个进程并运行另一个依赖于先前进程的进程?
答案 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
才能完成后台进程。此外,如果您想忽略这些内容,请将STDOUT
和STDERR
从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
。)