Tell me more ×
Ask Ubuntu is a question and answer site for Ubuntu users and developers. It's 100% free, no registration required.

Some GUI apps launch cleanly via the Terminal command line.

Some don't, and they cause the Terminal to wait for the app to terminate.
...and even then, some don't "release" the command line.

The mysterious ampersand "&" suffix, seems to cause the terminal to put the process into the background... (but I'm not sure what happens there).

Is there a way to launch an app via the Terminal, so that there is no "hang on" effect? ... just like launching something via F2.

I'd like to have the command line available again, immediately (without something still in the background and writing out system message in the terminal).

share|improve this question
At the request of htorque, I deleted his answer that you accepted. Please could you pick another answer (you will have to unselect htorque's first - should be lurking at the bottom of the page in red) – Oli Jun 1 '11 at 12:56
The method to deal with a Program-already-running (as outlined by con-f-use) is good for that situation, but as my primary question was about clean-launching with no terminal clutter, I've accepted screen (mentioned by Oli and RobinJ). I am impressed by its capability; after reading about it and trying it out... It only requires the typing of: screen -d -m gedit (or screen gedit then Ctrl+a d to detach)... and I still have full access to gedit's terminal view (for warning messages etc) at any time via screen -r even if I have closed the original terminal window in the meantime... – Peter.O Jun 4 '11 at 1:36

10 Answers

up vote 9 down vote accepted

In gedit's case, I just keep a copy open all the time. As long as you have an existing copy running, launching gedit calls from the terminal and then closing the terminal won't kill gedit.

For other things, what other people have said would work too. I'm a fan of nohup... But if you need a terminal you can detach but then re-attach to, you want to look at screen.

  1. Run it in a terminal and then run something that keeps pushing output. I use the Django development server but irssi or even watch uptime would be good examples.
  2. Kill the terminal and start a new one.
  3. Run screen -r and BOOM, you're back in.

screen is a lot bigger than that and you can combine it with byobu for a better terminal experience. Read around.

share|improve this answer
This is the first real insight I've had as to what screen does/can do... thanks for the terminal tip... – Peter.O Jun 4 '11 at 1:30

Suppose gedit is the program you want to run detached (aka. "disown", "disentangle", "decouple"). There are different ways depending on what you want to do exactly:

Program already running

Disown:

disown -h is the way to go if you want to do that with an already running program (i.e. if you forgot to nohup it). You first have to stop it using Ctrl+Z. Then you can put in in the brackground using bg [jobId] (e.g. bg 1). You get a list of running jobs with their jobId using jobs. After that you can decouple it from terminal using disown -h %[jobId]. Example terminal session:

confus@confusion:~$ gedit 
^Z
[1]+  Stopped                 gedit
confus@confusion:~$ jobs
[1]+  Stopped                 gedit
confus@confusion:~$ bg 1
[1]+ gedit &
confus@confusion:~$ disown -h %1
confus@confusion:~$ exit

Program not started yet

nohup

nohup is not always present on all machines. If you know you want to decouple beforehand you would use:

nohup gedit &

Maybe you will want to redirect the shell output as well and your program a pseudo input source, so: nohup ./myprogram > foo.out 2> bar.err < /dev/null &. You would want to redirect the output to either not be annoyed by it or to use it later. The null-input can help to prevent hickups in ssh an such.

Subshell:

You can achieve a similar effect by

confus@confusion:~$ (geany 2>&1 /dev/null &)

The brackets open a new subshell to run gedit in. The 2>&1 /dev/null redirects the shell output to nowhere (suppressing the output). And the & at the end puts the process in the background.

Terminal multiplexing

Also terminal multiplexing using screen or byobu. You basically run the program in a terminal of its own. I can really recommend byobu for other reasons too. Below is a list of boybu-shortcuts that might come in handy for your first steps:

Useful:

  • F2 Create a new window
  • F3 Move to the next window
  • F4 Move to the previous window
  • F6 Detach from the session and logout
  • Shift-F6 Detach from the session, but do not logout
  • F7 Enter scrollback/search mode
  • Ctrl-F5 Reconnect any SSH/GPG sockets or agents

Less useful:

Shift-F2 Split the screen horizontally -- Ctrl-F2 Split the screen vertically -- Shift-F3 Move focus to the next split -- Shift-F4 Move focus to the previous split -- Shift-F5 Collapse all splits -- F5 Refresh all status notifications -- F8 Rename the current window -- F9 Launch the Byobu Configuration Menu -- F12 GNU Screen's Escape Key -- Alt-Pageup Scroll back through this window's history -- Alt-Pagedown Scroll forward through this window's history -- Ctrl-a-! Toggle all of Byobu's keybindings on or off --

The 'at' deamon and others

at is a nice usefull little tool to run a command at a scheduled time. It can be 'misused' to detach a command from the shell:

echo './myprogram myoption1 myoption2' | at now

Also you can look into setsid and start-stop-daemon, but the other methods should suffice.

share|improve this answer
1  
+1 - Nice clear answer. – boehj May 31 '11 at 14:58

Use nohup

nohup is a program that runs a given command with hangup signals ignored, so that the command can continue running in the background after its parent process terminates. See the manpage

For example:

nohup gedit something
share|improve this answer
2  
What is nohup? Please elaborate. – Oxwivi May 31 '11 at 12:15
3  
nohup is a program that runs a given command with hangup signals ignored, so that the command can continue running in the background after its parent process terminates. See the manpage – Florian Diesch May 31 '11 at 12:23
Actually I think my answer is incorrect here. On further thought, nohup should be used in this scenario. – boehj May 31 '11 at 12:26
2  
When an interactive shell receive a SIGHUP signal, can send (or not, depending on settings) a SIGHUP signal to all of its childs. This can happen (or not, again) when a terminal is closed. A child not ready to handle such a signal will execute the default action, i.e. exit. The nohup application (and the disown bash builtin) do not allow the signal to reach the application. – enzotib May 31 '11 at 12:33
2  
One thing to be careful of is that nohup creates a file in the current directory called nohup.out. See the man page for more details. I prefer disown for this reason, and for the fact that disown works after you launch gedit. – Flimm May 31 '11 at 14:17
show 2 more comments

The mysterious ampersand "&" suffix, seems to cause the terminal to put the process into the background... (but I'm not sure what happens there).

It does, and is often what you want. If you forget to use &, you can suspend the program with ctrl-z then place it in the background with the bg command — and continue to use that shell.

The process' stdin, stdout, and stderr are still connected to the terminal; you can redirect those from/to /dev/null or any other file (e.g. save an output log somewhere), as desired:

some-program </dev/null &>/dev/null &
# &>file is bash for 1>file 2>&1

You can see the process in jobs, bring it back to the foreground (fg command), and send it signals (kill command).

Some graphical programs will detach from the terminal; if that's the case, when you run the command "normally" you'll notice it starts the graphical program and "exits".


Here's a short script, you can place it in ~/bin, which I named runbg:

#!/bin/bash
[ $# -eq 0 ] && {  # $# is number of args
  echo "$(basename $0): missing command" >&2
  exit 1
}
prog="$(which "$1")"  # see below
[ -z "$prog" ] && {
  echo "$(basename $0): unknown command: $1" >&2
  exit 1
}
shift  # remove $1, now $prog, from args
tty -s && exec </dev/null      # if stdin is a terminal, redirect from null
tty -s <&1 && exec >/dev/null  # if stdout is a terminal, redirect to null
tty -s <&2 && exec 2>&1        # stderr to stdout (which might not be null)
"$prog" "$@" &  # $@ is all args

I look up the program ($prog) before redirecting so errors in locating it can be reported. Run it as "runbg your-command args..."; you can still redirect stdout/err to a file if you need to save output somewhere.

Except for the redirections and error handling, this is equivalent to htorque's answer.

share|improve this answer
Okay, thanks... It seems that ctrl-z (suspend) gives me access to the command line again, but blanks out the GUI until I issue bg which seems to un-suspend it. (makes sense)... Is there another command by which I can detach the GUI... Aha! I see now what you mean by sighals (kill command)... (interesting things these signals).. I used a code snippet to make dd progressively output it stats.. and it used kill + a SIGNAL... Is there a specific SIGNAL to detach a "job"? – Peter.O Oct 31 '10 at 12:41
I just noticed your comment to Rick's answer... I tried disown jobs -p gedit`` and it seemd to remove the job.... (but I got system messages in the Terminal when I manually closed gedit... but I think I've got a screwed-up Terminal at the moment... too much experimenting :( – Peter.O Oct 31 '10 at 12:51
@fred: Jobs are managed by the shell, so no signal can control that. You may find it works best to start several shells — several GUI terminals allow tabs and you can use screen or tmux. – Roger Pate Oct 31 '10 at 12:52
2  
@fred: better don't run jobs -p command if you have multiple instances of one command running in the background at a time. you can use jobs to find the right job id and then do jobs -p <job-id> to get the job's PID. Personally I find the version with the subshell a lot easier. ;-) – htorque Oct 31 '10 at 13:22
2  
@htorque, fred: You can run disown without parameters to have bash disown the last job: gedit & disown – Roger Pate Oct 31 '10 at 13:32
show 4 more comments

You use the command nohup

nohup firefox &

share|improve this answer
Another one that works!... This is all very new to me, so I'll have to experiment withl all the solutions presented.... I don't quite understand what "nohup" does... I get the feeling that it makes the app unresponsive to external shut-down signals?... but is there some draw-back to this? eg. Does this mean that the app cannot respond properly/normally to a system shutdown?.... I like its automatic logging feature. – Peter.O Nov 1 '10 at 2:52
@fred: Hup is hang-up, which happens when you logout — nohup ignores this signal instead of the default exit action (see man 7 signal). It's an old command (and signal) from the days of multi-user systems that you called in to use. – Roger Pate Nov 1 '10 at 3:52
Dial-up! heheheh, as in dial-up modems,and the hanging-up the modem... (a blast from the past! :)... So the "log-out" that got me wondering, means logging-out from the remote connection, and not from the current Linux session..... the info page mentions: COMMAND must not be a special built-in utility. This doesn't clash with my intended use, and it seems that this also applies to other command-launching commands".. here is a link to those "special" utils: gnu.org/software/coreutils/manual/html_node/… – Peter.O Nov 1 '10 at 5:40
PS... I think the reason the penny didn't drop earlier, is that in Windows (where I've lived since its inception) "hangup" has meant something quite different; eg. the blue-screen one!;).... – Peter.O Nov 1 '10 at 5:53

To start an application and detach it from the launched terminal use &!.

firefox &!
share|improve this answer
4  
Good to know, but that seems to be zsh-only. In bash you'd have to manually run disown <pid-of-command> after starting the command in the background. – htorque Oct 31 '10 at 12:29
Interesting... I'm going to look into zsh, but as a Linux newbie, I'll stick with bash for now... Thanks – Peter.O Nov 1 '10 at 2:55
what does the exclamation mark do ? – nutty about natty Jan 13 at 17:30
The ! will break the application process from the terminal process so that you can close the terminal without the application that was launched from closing. It seems to be a zsh thing, but handy. – Rick Jan 14 at 14:21

Append a '&' at the end of the command. For example:

$ gksudo gedit /etc/fstab &

This will run the process in the background and you can close the terminal.

share|improve this answer
1  
it works for gksudo gedit, but for gedit as normal user, it still terminate the Gedit app when I close the terminal. :) – kv1dr May 31 '11 at 12:25
You're exactly right. My answer's wrong here. Sorry. – boehj May 31 '11 at 12:30
No problem. We are learning from mistakes. ;) – kv1dr May 31 '11 at 12:32
4  
@kvldr: if you use 'disown' command after 'gedit &' then closing terminal will not close gedit. disown detaches the last background job from terminal and therefore is also useful in a situation where you have already started a background job from terminal and now dont want it to close when the terminal closes – binW May 31 '11 at 13:22

Open the terminal, type screen, type the command you want to run, close the terminal. The program should keep on running in the GNU Screen session.

share|improve this answer
What exactly is GNU Screen? – Oxwivi May 31 '11 at 15:11
If I get the idea correctly, it's a kind of window manager for the command line. It allows you to run more than one program at once in a command line interface session. – RobinJ May 31 '11 at 15:14
Byobu? – Oxwivi May 31 '11 at 15:38
Something like that, only Byobu is easier to use. If I am npot mistaken, Byobu is just an easier interface for GNU Screen. – RobinJ May 31 '11 at 15:39

This works for me:

gedit myfile.txt & disown

the part & disown detaches the program from the terminal

share|improve this answer
1  
This is what I generally use.... – belacqua Sep 14 '11 at 16:52

This worked for me:

$ (nohup gedit 2>/dev/null &)
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.