Risposte:
Il nohup
comando scrive solo nohup.out
se l'output andrebbe altrimenti al terminale. Se hai reindirizzato l'output del comando da qualche altra parte - incluso /dev/null
- è lì che va invece.
nohup command >/dev/null 2>&1 # doesn't create nohup.out
Se lo stai usando nohup
, probabilmente significa che vuoi eseguire il comando in background inserendone un altro &
alla fine di tutto:
nohup command >/dev/null 2>&1 & # runs in background, still doesn't create nohup.out
Su Linux, l'esecuzione di un lavoro con nohup
chiude automaticamente anche il suo input. Su altri sistemi, in particolare BSD e macOS, non è così, quindi quando si esegue in background, è possibile chiudere manualmente l'input. Mentre la chiusura dell'input non ha alcun effetto sulla creazione o meno di nohup.out
, evita un altro problema: se un processo in background tenta di leggere qualcosa dall'input standard, si fermerà, aspettando che tu lo riporti in primo piano e digiti qualcosa. Quindi la versione extra-sicura si presenta così:
nohup command </dev/null >/dev/null 2>&1 & # completely detached from terminal
Si noti, tuttavia, che ciò non impedisce al comando di accedere direttamente al terminale, né lo rimuove dal gruppo di processi della shell. Se si desidera eseguire quest'ultima operazione e si esegue bash, ksh o zsh, è possibile farlo eseguendo disown
senza argomento come comando successivo. Ciò significa che il processo in background non è più associato a un "lavoro" della shell e non avrà alcun segnale inoltrato dalla shell. (Nota la distinzione: un disown
processo ed non riceve alcun segnale inoltrato automaticamente dal suo guscio principale - ma senza nohup
, riceverà comunque un HUP
segnale inviato con altri mezzi, come un kill
comando manuale . Un nohup
processo "ed" ignora tutti i HUP
segnali, non importa come vengono inviati.)
Spiegazione:
Nei sistemi Unixy, ogni sorgente di input o target di output ha un numero associato ad esso chiamato "descrittore di file", o "fd" in breve. Ogni programma in esecuzione ("processo") ne ha una propria serie e quando un nuovo processo si avvia ne ha già tre aperti: "input standard", che è fd 0, è aperto per la lettura del processo, mentre "output standard" (fd 1) e "errore standard" (fd 2) sono aperti per la scrittura. Se si esegue semplicemente un comando in una finestra del terminale, per impostazione predefinita, tutto ciò che si digita va al suo input standard, mentre sia il suo output standard che l'errore standard vengono inviati a quella finestra.
Ma puoi chiedere alla shell di cambiare dove uno o tutti quei descrittori di file puntano prima di lanciare il comando; questo è ciò che il reindirizzamento ( <
, <<
, >
, >>
) e tubo ( |
operatori) fanno.
Il tubo è il più semplice di questi ... command1 | command2
organizza l'output standard di command1
per alimentare direttamente l'input standard di command2
. Questa è una disposizione molto utile che ha portato a un particolare modello di progettazione negli strumenti UNIX (e spiega l'esistenza di un errore standard, che consente a un programma di inviare messaggi all'utente anche se il suo output sta andando al programma successivo nella pipeline) . Ma puoi solo reindirizzare l'output standard all'input standard; non è possibile inviare altri descrittori di file a una pipe senza giocoleria.
Gli operatori di reindirizzamento sono più amichevoli in quanto consentono di specificare quale descrittore di file reindirizzare. Quindi 0<infile
legge l'input standard dal file denominato infile
, mentre 2>>logfile
aggiunge l'errore standard alla fine del file denominato logfile
. Se non si specifica un numero, immettere i valori predefiniti di reindirizzamento su fd 0 ( <
è uguale a 0<
), mentre il reindirizzamento di default su fd 1 ( >
è uguale a 1>
).
Inoltre, puoi combinare insieme i descrittori di file: 2>&1
significa "invia errore standard ovunque stia andando l'output standard". Ciò significa che si ottiene un singolo flusso di output che include sia l'uscita standard che l'errore standard mescolati senza alcun modo per separarli più, ma significa anche che è possibile includere l'errore standard in una pipe.
Quindi la sequenza >/dev/null 2>&1
significa "invia l'output standard a /dev/null
" (che è un dispositivo speciale che getta via qualunque cosa tu scriva ad esso) "e quindi invia l'errore standard ovunque vada l'output standard" (cosa che ci siamo appena assicurati che fosse /dev/null
). Fondamentalmente, "butta via qualsiasi cosa questo comando scriva su entrambi i descrittori di file".
Quando nohup
rileva che né il suo errore standard né l'output sono collegati a un terminale, non si preoccupa di creare nohup.out
, ma presuppone che l'output sia già reindirizzato dove l'utente vuole che vada.
Il /dev/null
dispositivo funziona anche per l'input; se si esegue un comando con </dev/null
, qualsiasi tentativo da parte di quel comando di leggere dall'input standard incontrerà immediatamente la fine del file. Si noti che la sintassi di unione non avrà lo stesso effetto qui; funziona solo per indicare un descrittore di file a un altro aperto nella stessa direzione (input o output). La shell ti permetterà di farlo >/dev/null <&1
, ma questo finisce per creare un processo con un descrittore di file di input aperto su un flusso di output, quindi invece di colpire solo la fine del file, qualsiasi tentativo di lettura attiverà un errore fatale "descrittore di file non valido".
nohup
"se il processo in seguito tenta di leggere qualcosa dall'input standard, si fermerà, aspettando che tu lo riporti in primo piano e digiti qualcosa". sembra errato. Invece, nohup
chiude standard input (il programma non sarà in grado di leggere qualsiasi ingresso, anche se viene eseguito in primo piano. Non viene arrestata, ma riceverà un codice di errore o EOF).
nohup
non non ingresso vicino di serie automaticamente. Nota che nohup
non è un built-in di shell ma un'utilità binaria.
nohup
è diversa per Linux e per BSD o OS X?
awk
è diverso, sed
è diverso, nohup
è diverso ...
</dev/null
? Vedi anche 0>/dev/null
unix.stackexchange.com/a/266247
nohup some_command > /dev/null 2>&1&
Questo è tutto ciò che devi fare!
&
accensione ti impedirà di utilizzare ctrl-c
, se questo è importante per te.
some_command
dell'output, incluso l'errore.
Hai provato a reindirizzare tutti e tre i flussi I / O:
nohup ./yourprogram > foo.out 2> foo.err < /dev/null &
>
/ dev / null piuttosto che </ dev / null?
< /dev/null
reindirizza l'input standard per nohup
. Linux non lo richiede, ma POSIX consente comportamenti che nohup
non possono essere eseguiti in background se il suo input standard è collegato al terminale. Esempi di tali sistemi sono BSD e OS X.
Potresti voler usare il programma di distacco . Lo usi come, nohup
ma non produce un registro di output se non glielo dici. Ecco la pagina man:
NAME
detach - run a command after detaching from the terminal
SYNOPSIS
detach [options] [--] command [args]
Forks a new process, detaches is from the terminal, and executes com‐
mand with the specified arguments.
OPTIONS
detach recognizes a couple of options, which are discussed below. The
special option -- is used to signal that the rest of the arguments are
the command and args to be passed to it.
-e file
Connect file to the standard error of the command.
-f Run in the foreground (do not fork).
-i file
Connect file to the standard input of the command.
-o file
Connect file to the standard output of the command.
-p file
Write the pid of the detached process to file.
EXAMPLE
detach xterm
Start an xterm that will not be closed when the current shell exits.
AUTHOR
detach was written by Robbert Haarman. See http://inglorion.net/ for
contact information.
Nota Non ho alcuna affiliazione con l'autore del programma. Sono solo un utente soddisfatto del programma.
sudo bash -c "nohup /opt/viptel/viptel_bin/log.sh $* &> /dev/null" &
Il reindirizzamento dell'output di sudo fa sì che sudo riesca a cercare la password, quindi è necessario un meccanismo imbarazzante per fare questa variante.
Se hai una shell BASH sul tuo mac / linux di fronte a te, prova i passaggi seguenti per capire praticamente il reindirizzamento:
Crea uno script di 2 righe chiamato zz.sh
#!/bin/bash
echo "Hello. This is a proper command"
junk_errorcommand
Attualmente, semplicemente eseguendo lo script viene inviato sullo schermo sia STDOUT che STDERR.
./zz.sh
Ora inizia con il reindirizzamento standard:
zz.sh > zfile.txt
In quanto sopra, "echo" (STDOUT) va in zfile.txt. Mentre "errore" (STDERR) viene visualizzato sullo schermo.
Quanto sopra è uguale a:
zz.sh 1> zfile.txt
Ora puoi provare il contrario e reindirizzare "errore" STDERR nel file. Il comando STDOUT da "echo" va sullo schermo.
zz.sh 2> zfile.txt
Combinando i due precedenti, ottieni:
zz.sh 1> zfile.txt 2>&1
Spiegazione:
Alla fine, puoi impacchettare tutto all'interno del comando nohup e eseguirlo in background:
nohup zz.sh 1> zfile.txt 2>&1&