8

I use nohup quite often for important long running processes under linux/bash, so much so that nohup time my command with arguments && mv nohup.out my.log is almost an idiom for me.

The problem is that nohup puts both stdout and stderr into nohup.out, and I cannot control the name of the file. This means that if I accidentally start two nohups in the same directory, their output will be interleaved in nohup.out.

The questions are:

  1. How do I deal with this problem? Always running nohups in separate directories and writing a shell function which will first check for ./nohup.out are two sucky options I see.

  2. How come I cannot tell nohup where to redirect the output? GNU tools tend to have so many options, why not nohup?

sds
  • 2,108

3 Answers3

11

You can redirect both stdout and stderr to one file. With Bash 4 (or others such as Zsh), as easy as:

nohup <some-command> &> output.log

I can't tell you why there's no separate option for nohup to set the output, but if your shell can take care of that, you don't really need an option.

slhck
  • 235,242
8

To Append output in user defined file you can use >> in nohup command.

nohup php your_command >> filename.out 2>&1 &

This command will append all output in your file without removing old data.

3

There are more ways than just nohup to start a process so that it would ignore SIGHUP; for example: (written as shell functions)

nohup() {
    setsid "$@"
}

nohup() {
    ("$@" &)
}

nohup() {
    "$@" & disown
}

(setsid, or even (setsid "$@" &), might be the best choice.)

All of them allow you to specify your own redirections with >, 2>, and &>/>&.

grawity
  • 501,077