Running bash script does not return to terminal when using ampersand (&) to run a subprocess in the background Running bash script does not return to terminal when using ampersand (&) to run a subprocess in the background bash bash

Running bash script does not return to terminal when using ampersand (&) to run a subprocess in the background


What i ended up doing was to make to change parent.sh to the following

#!/bin/bashchild.sh param1a param2a > startup.log &child.sh param1b param2b > startup2.log &exit 0

I would not have come to this solution without your suggestions and root cause analysis of the issue. Thanks!

And apologies for my inaccurate comment. (There was no input, I answered from memory and I remembered incorrectly.)


The following link from the Linux Documentation Project suggests adding a wait after your mail command in child.sh:

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

Summary of the above document

Within a script, running a command in the background with an ampersand (&) may cause the script to hang until ENTER is hit. This seems to occur with commands that write to stdout. It can be a major annoyance.

....
....

As Walter Brameld IV explains it:

As far as I can tell, such scripts don't actually hang. It just seems that they do because the background command writes text to the console after the prompt. The user gets the impression that the prompt was never displayed. Here's the sequence of events:

  1. Script launches background command.
  2. Script exits.
  3. Shell displays the prompt.
  4. Background command continues running and writing text to the console.
  5. Background command finishes.
  6. User doesn't see a prompt at the bottom of the output, thinks script is hanging.

If you change child.sh to look like the following you shouldn't experience this annoyance:

#!/bin/bashjava com.test.Mainecho "Main Process Stopped" | mail -s "WARNING-Main Process is down." user@gmail.comwait

Or as @SebastianStigler states in a comment to your question above:

Add a > /dev/null at the end of the line with mail. mail will otherwise try to start its interactive mode.

This will cause the mail command to write to /dev/null rather than stdout which should also stop this annoyance.

Hope this helps


The process was still linked to the controlling terminal because STDOUT needs somewhere to go. You solved that problem by redirecting to a file ( > startup.log ).

If you're not interested in the output, discard STDOUT completely ( >/dev/null ).

If you're not interested in errors, either, discard both ( &>/dev/null ).

If you want the processes to keep running even after you log out of your terminal, use nohup — that effectively disconnects them from what you are doing and leaves them to quietly run in the background until you reboot your machine (or otherwise kill them).

nohup child.sh param1a param2a &>/dev/null &