Ordem entre 'nohup', '&' e redirecionamento?

3

Qual é a ordem correta entre nohup , & e redirecionamento ao usar juntos?

Por que outras ordens não estão corretas?

Por exemplo,

$ nohup firefox& &> /dev/null

$ nohup firefox &> /dev/null  &

e não sei como alterar a ordem entre nohup com redirecionamento e & .

Outro exemplo,

$ nohup sleep 1000 & &>/dev/null

não redireciona para /dev/null , mas ainda para ./nohup.out .

    
por Tim 29.02.2016 / 21:27

2 respostas

2

Gostaria de começar com a seção SHELL GRAMMAR da página de manual para bash :

Simple Commands

A simple command is a sequence of optional variable assignments followed by blank-separated words and redirections, and terminated by a control operator.

Portanto, redirecionamento ( &>/dev/null ) vai primeiro e o operador de controle segue ( & ).

Editar: E para completar a resposta, o nohup é a primeira parte do comando simples . Não tem nenhum significado especial em bash .

Exatamente o seu exemplo (exceto o /dev/null , que só torna complicado):

jakuje@E6430:/tmp$ rm nohup.out out
jakuje@E6430:/tmp$ nohup sleep 1 & &>out
[1] 10876
nohup: ignoring input and appending output to ‘nohup.out’
[1]+  Done                    nohup sleep 1
jakuje@E6430:/tmp$ cat nohup.out             # empty
jakuje@E6430:/tmp$ cat out                   # empty
jakuje@E6430:/tmp$ rm nohup.out
jakuje@E6430:/tmp$ nohup sleep 1 &>out &
[1] 10882
[1]+  Done                    nohup sleep 1 &> out
jakuje@E6430:/tmp$ cat nohup.out             # no file
cat: nohup.out: No such file or directory
jakuje@E6430:/tmp$ cat out                   # output of nohup
nohup: ignoring input
    
por 29.02.2016 / 21:42
1

O comando nohup é o comando que você está executando neste caso. A palavra firefox não é interpretada pelo shell como um comando; é simplesmente passado como um argumento para nohup . O que o comando nohup faz com esse argumento é "nenhum dos negócios do shell".

É claro que nohup é pegar esse argumento e executá-lo como um comando.

O ponto é que o que você está realmente fazendo do ponto de vista do shell está redirecionando a saída de nohup , não a saída de firefox .

No entanto, nohup fará coisas diferentes com a saída do comando que ele executa, dependendo de onde sua própria saída é apontada. Das especificações POSIX para nohup (grifo nosso):

If the standard output is a terminal, all output written by the named utility to its standard output shall be appended to the end of the file nohup.out in the current directory. If nohup.out cannot be created or opened for appending, the output shall be appended to the end of the file nohup.out in the directory specified by the HOME environment variable. ...

If standard error is a terminal and standard output is open but is not a terminal, all output written by the named utility to its standard error shall be redirected to the same open file description as the standard output. ...

Então, devido a uma mágica interna de nohup , seus redirecionamentos funcionam como o esperado se você executar:

nohup utility >/dev/null &

Observe que você não precisa redirecionar os stderr e stdout , pois o comando nohup redirecionará o stderr do utilitário dependendo de onde nohup 's própria saída está apontando para. (Sem mencionar que &> não é portátil.)

Há também um problema de portabilidade com sua entrada. Como o seu stdin está conectado ao seu terminal, é específico da implementação o que acontecerá com ele. (Veja nota em "Fundamentação" nas especificações nohup POSIX .) pode ser melhor usar:

nohup firefox >/dev/null </dev/null &

E, como já mencionado nos comentários, não há nenhuma circunstância com nohup ou qualquer outro comando em que você deve colocar um redirecionamento após o segundo plano & .

    
por 01.03.2016 / 22:01