33

Is it possible to launch a command or Bash script exit terminal and NOT interrupt command?

My solution was to run cron at a specific time of day, but I'm sure there is something easier.

1

4 Answers 4

64

To avoid exit signals propagating to child processes of the terminal and shell, run the command with nohup, i.e.:

nohup cmd &

To ignore all program output and avoid the nohup.out file, you can redirect stdout and stderr to /dev/null like this (with bash):

nohup cmd &> /dev/null &
10
  • 3
    This is the correct answer. Without nohup, the started process is still considered a "child" of the terminal process and thus terminated if the terminal is closed.
    – Izzy
    Jul 13, 2012 at 13:04
  • 4
    cmd & disown works too, since the & is treated like a ; command separator. The disown command removes the connection between the bash shell session and the backgrounded command.
    – lornix
    Jul 14, 2012 at 20:34
  • 2
    zsh has a shorthand for this: cmd &|.
    – Thor
    Oct 26, 2012 at 9:24
  • 1
    nohup creates a file when it runs, for me, so I added > /dev/null to ignore the output.
    – Andrew
    May 10, 2023 at 21:42
  • 1
    @Andrew: did you see antoines comment above? It is sometimes related to the terminal, yes. With regards to your edit, ignoring program output might be fine in some cases, I've added it as an alternative
    – Thor
    May 12, 2023 at 9:36
6

If you want to run a specific command or file every second or so in the background after exiting the terminal you could try this easy little thing;

nohup watch -n5 'bash script.sh' &

That would run scipt.sh every 5 seconds.

2
  • 1
    "nohup" is already covered by the accepted answer. And I'm pretty sure the asker mentioned cron because they were using it to say "Run this command a few seconds in the future", not to run it periodically. Aug 6, 2015 at 21:01
  • 1
    My answer don't make things worse. Do see the point of down vote. Neural would be sufficient.
    – lejahmie
    Aug 6, 2015 at 21:41
6

Using screen:

screen -S <session name> -d -m <your command>

after that you can quit the terminal, also you can reattach to it by:

screen -r <session name>

More info: reference

3

Put a "&" character after your command.

e.g:

/home/your/script.sh &
7
  • 9
    in this case, when the terminal is closed, so is the process started by /home/your/script.sh -- as it was not detached from its "parent", but just "backgrounded". Use nohup to detach it for real.
    – Izzy
    Jul 13, 2012 at 13:05
  • My bad, I didn't knew about that, but when I tested on my Debian, the command kept executing after closing the shell which launched it :/
    – Flinth
    Jul 13, 2012 at 14:03
  • 1
    I'm not sure where exactly the backgrounded process is attached to and when. But if you e.g. log in to a remote machine, it is definitely stopped as soon as you log out (except if it daemonized itself). So to be 100% sure, you rather use nohup -- which also logs all (now invisible) output into a file called nohup.out located in the directory you started the command from.
    – Izzy
    Jul 13, 2012 at 14:10
  • Okay, well thank you for your explanations ^^
    – Flinth
    Jul 13, 2012 at 14:18
  • This answer might work ok when combined with the jobs command. Quite often i want to be able to get back to the shell process after backgrounding it.
    – djangofan
    Dec 7, 2018 at 19:17

You must log in to answer this question.