the*_*ian 8 bash shell scripting background-process ampersand
我有一个脚本(让我们称之为parent.sh),它对运行java进程的第二个脚本(child.sh)进行2次调用.child.sh脚本在后台运行,方法是在parent.sh中放置一行&.但是,当我运行parent.sh时,我需要按Ctrl + C返回终端屏幕.这是什么原因?是否与child.sh进程在parent.sh进程下运行这一事实有关.所以parent.sh不会死,直到孩子们这样做?
parent.sh
#!/bin/bash
child.sh param1a param2a &
child.sh param1b param2b &
exit 0
Run Code Online (Sandbox Code Playgroud)
child.sh
#!/bin/bash
java com.test.Main
echo "Main Process Stopped" | mail -s "WARNING-Main Process is down." user@email.com
Run Code Online (Sandbox Code Playgroud)
如您所见,我不想在后台运行java进程,因为我想在进程终止时发送邮件.从功能的角度来看,如上所述可以正常工作,但我想知道如何在执行parent.sh后让它返回终端.
我最终做的是将parent.sh更改为以下内容
#!/bin/bash
child.sh param1a param2a > startup.log &
child.sh param1b param2b > startup2.log &
exit 0
Run Code Online (Sandbox Code Playgroud)
如果没有您对该问题的建议和根本原因分析,我不会得到这个解决方案.谢谢!
并为我的不准确评论道歉.(没有输入,我从记忆中回答,我记得错了.)
该进程仍然链接到控制终端,因为STDOUT需要去某个地方。您通过重定向到文件解决了该问题(> startup.log ) 解决了该问题。
如果您对输出不感兴趣,请完全丢弃 STDOUT ( >/dev/null)。
如果您对错误也不感兴趣,请丢弃两者 ( &>/dev/null)。
如果您希望进程即使在注销终端后也继续运行,请使用nohup \xe2\x80\x94 有效地将它们与您正在执行的操作断开连接,并让它们在后台安静地运行,直到您重新启动计算机(或否则杀死他们)。
\nnohup child.sh param1a param2a &>/dev/null &\nRun Code Online (Sandbox Code Playgroud)\n
Linux 文档项目中的以下链接建议wait在您的mail命令后添加child.sh:
http://tldp.org/LDP/abs/html/x9644.html
在脚本中,在后台运行带有与号 (&) 的命令可能会导致脚本挂起,直到按下 ENTER。这似乎发生在写入标准输出的命令中。这可能是一个主要的烦恼。
....
....正如 Walter Brameld IV 所解释的那样:
据我所知,这些脚本实际上并没有挂起。似乎他们这样做是因为后台命令在提示后将文本写入控制台。用户得到的印象是提示从未显示过。这是事件的顺序:
- 脚本启动后台命令。
- 脚本退出。
- Shell 显示提示。
- 后台命令继续运行并将文本写入控制台。
- 后台命令完成。
- 用户在输出底部没有看到提示,认为脚本正在挂起。
如果您更改child.sh为如下所示,您就不会遇到这种烦恼:
#!/bin/bash
java com.test.Main
echo "Main Process Stopped" | mail -s "WARNING-Main Process is down." user@gmail.com
wait
Run Code Online (Sandbox Code Playgroud)
或者正如@SebastianStigler 在对上述问题的评论中所说的那样:
> /dev/null在邮件行的末尾添加一个。否则邮件将尝试启动其交互模式。
这将导致邮件命令写入/dev/null而不是stdout哪个也应该停止这种烦恼。
希望这可以帮助