使用&符号(&)在后台运行子进程时,运行bash脚本不会返回到终端

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后让它返回终端.

the*_*ian 8

我最终做的是将parent.sh更改为以下内容

#!/bin/bash
child.sh param1a param2a > startup.log &
child.sh param1b param2b > startup2.log &
exit 0
Run Code Online (Sandbox Code Playgroud)

如果没有您对该问题的建议和根本原因分析,我不会得到这个解决方案.谢谢!

并为我的不准确评论道歉.(没有输入,我从记忆中回答,我记得错了.)

  • 我遇到了同样的问题,这对我有用.如果您不需要收集输出,则将`&`替换为`/ dev/null&`也可以. (2认同)

Tim*_*Tim 8

该进程仍然链接到控制终端,因为STDOUT需要去某个地方。您通过重定向到文件解决了该问题(> startup.log ) 解决了该问题。

\n

如果您对输出不感兴趣,请完全丢弃 STDOUT ( >/dev/null)。

\n

如果您对错误也不感兴趣,请丢弃两者 ( &>/dev/null)。

\n

如果您希望进程即使在注销终端后也继续运行,请使用nohup \xe2\x80\x94 有效地将它们与您正在执行的操作断开连接,并让它们在后台安静地运行,直到您重新启动计算机(或否则杀死他们)。

\n
nohup child.sh param1a param2a &>/dev/null &\n
Run Code Online (Sandbox Code Playgroud)\n


pti*_*rno 7

Linux 文档项目中的以下链接建议wait在您的mail命令后添加child.sh

http://tldp.org/LDP/abs/html/x9644.html

以上文件摘要

在脚本中,在后台运行带有与号 (&) 的命令可能会导致脚本挂起,直到按下 ENTER。这似乎发生在写入标准输出的命令中。这可能是一个主要的烦恼。

....
....

正如 Walter Brameld IV 所解释的那样:

据我所知,这些脚本实际上并没有挂起。似乎他们这样做是因为后台命令在提示后将文本写入控制台。用户得到的印象是提示从未显示过。这是事件的顺序:

  1. 脚本启动后台命令。
  2. 脚本退出。
  3. Shell 显示提示。
  4. 后台命令继续运行并将文本写入控制台。
  5. 后台命令完成。
  6. 用户在输出底部没有看到提示,认为脚本正在挂起。

如果您更改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哪个也应该停止这种烦恼。

希望这可以帮助