Shell脚本嵌套调用时子脚本无法终止,单独运行正常的问题
嘿,我看你遇到的问题是:通过Script1调用DownTimeCalc.sh时,这个子脚本死活不终止,但单独跑它就正常结束。我帮你捋捋问题根源,再给你解决办法。
首先,问题大概率出在你写的exec ./DownTimeCalc.sh &这行代码上。咱们先搞懂exec命令的特性:它不是启动一个新的子进程,而是直接用新进程替换当前的Shell进程。当你加了&把它扔后台运行时,其实是先启动了一个后台的子Shell,然后在这个子Shell里用exec把它替换成DownTimeCalc.sh的进程。这种情况下,这个后台进程可能因为和父进程的关联、或者标准输入输出没处理好,导致没法正常退出。
给你两个简单的解决方案:
方案一:去掉
exec,直接后台运行脚本
这是最直接的办法,把那行代码改成./DownTimeCalc.sh &就行。这样会启动一个完全独立的子进程来运行DownTimeCalc.sh,和你单独手动运行它的行为完全一致,脚本执行完就会正常终止,不会卡住。方案二:如果非要用
exec(其实这里没必要),重定向标准流
有时候后台进程会因为依赖终端的标准输入/输出/错误而挂起,这时候可以把这些流都重定向到/dev/null:exec ./DownTimeCalc.sh >/dev/null 2>&1 &
不过还是方案一更推荐,因为你本来就只是想启动一个后台子脚本,exec在这里完全是多余的操作。
要是改了之后还是有问题,你可以检查下DownTimeCalc.sh里有没有需要终端交互的命令(比如read、或者依赖tty的操作)。单独运行时你有终端,这些命令能正常处理,但后台调用时没有终端,就会卡住。这种情况就得把DownTimeCalc.sh里的交互操作去掉,或者给它们重定向输入。
最后给你修改后的Script1示例代码:
#!/bin/bash WebApp="R" #----------检查Web应用状态 localWebAppURL="http://localhost:8082/" if curl --max-time 5 --output /dev/null --silent --head --fail "$localWebAppURL"; then WebApp="G" else # 去掉exec,直接后台运行子脚本 ./DownTimeCalc.sh & fi echo "WebApp Status|\"WebApp\":\"$WebApp\""
内容的提问来源于stack exchange,提问作者KoteswaraRao Balijepalli

