Come posso usare il comando nohup senza ottenere nohup.out?

Ho un problema con il comando nohup.

Quando gestisco il mio lavoro, ho molti dati. L’output nohup.out diventa troppo grande e il mio processo rallenta. Come posso eseguire questo comando senza ottenere nohup.out?

nohup scrive solo su nohup.out se l’output è diverso dal terminale. Se si reindirizza l’output del comando da qualche altra parte, incluso /dev/null , è dove invece va.

  nohup command >/dev/null 2>&1 # doesn't create nohup.out 

Se stai usando nohup , probabilmente significa che vuoi eseguire il comando in background inserendo 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 OS X, non è così, quindi quando si esegue in background, si potrebbe voler chiudere il suo input manualmente. Mentre l’input di chiusura 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 interromperà, in attesa di riportarlo in primo piano e digitare qualcosa . Quindi la versione extra-sicura assomiglia a questo:

 nohup command /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 vuoi fare quest’ultimo, puoi farlo eseguendo disown senza argomenti come comando successivo, a quel punto il processo non è più associato a un “job” di shell e non avrà alcun segnale (non solo HUP ) inoltrato ad esso dal guscio.

Spiegazione:

Nei sistemi Unix, ogni sorgente di input o destinazione dell’output ha un numero associato ad esso chiamato “descrittore di file” o “fd” in breve. Ogni programma in esecuzione (“processo”) ha il proprio set di questi e quando viene avviato un nuovo processo ne sono già aperti tre: “standard input”, che è fd 0, è aperto per il processo da cui leggere, mentre “standard output” (fd 1) e “standard error” (fd 2) sono aperti per poter scrivere su. Se esegui semplicemente un comando in una finestra di terminale, per impostazione predefinita, tutto ciò che scrivi va al suo input standard, mentre sia l’output standard che l’errore standard vengono inviati a quella finestra.

Ma puoi chiedere alla shell di cambiare dove alcuni o tutti quei descrittori di file puntano prima di lanciare il comando; questo è ciò che fanno gli operatori di reindirizzamento ( < , << , > , >> ) e pipe ( | ).

La pipa è la più semplice di queste ... command1 | command2 command1 | command2 ordina 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 nel prossimo programma nella pipeline) . Ma puoi solo convogliare l'output standard sull'input standard; non è ansible inviare altri descrittori di file a una pipe senza un po 'di giocoleria.

Gli operatori di reindirizzamento sono più amichevoli in quanto consentono di specificare il descrittore di file da redirect. Quindi 0 legge l'input standard dal file 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 dell'output è impostato su fd 1 ( > è uguale a 1> ).

Inoltre, è ansible combinare insieme i descrittori di file: 2>&1 significa "invia errore standard ovunque sia in uscita standard". Ciò significa che si ottiene un singolo stream di output che include sia lo standard out che l'errore standard mescolati con nessun modo per separarli più, ma significa anche che è ansible includere un errore standard in una pipe.

Quindi la sequenza >/dev/null 2>&1 significa "invia output standard a /dev/null " (che è un dispositivo speciale che butta via qualsiasi cosa tu scriva su di esso) "e poi invia errore standard a qualunque uscita standard stia andando "(che abbiamo appena fatto in modo che fosse /dev/null ). Fondamentalmente, "butta via qualunque 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.

Anche il dispositivo /dev/null funziona per l'input; se si esegue un comando con , qualsiasi tentativo da parte di quel comando di leggere dall'input standard incontrerà immediatamente la fine del file. Nota che la syntax di unione non avrà lo stesso effetto qui; funziona solo per puntare un descrittore di file su un altro aperto nella stessa direzione (input o output). La shell ti permetterà di fare >/dev/null <&1 , ma questo finisce per creare un processo con un descrittore di file di input aperto su un stream di output, quindi invece di colpire la fine del file, qualsiasi tentativo di lettura attiverà un errore Errore "descrittore file non valido".

 nohup some_command > /dev/null 2>&1& 

Questo è tutto ciò che devi fare!

Hai provato a redirect tutti e tre i flussi di I / O:

 nohup ./yourprogram > foo.out 2> foo.err < /dev/null & 

Potresti voler usare il programma di scollegamento . Lo usi come nohup ma non produce un log di output a meno che tu non lo dica. 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 reask per la password, quindi è necessario un meccanismo scomodo per fare questa variante.

Il seguente comando ti permetterà di eseguire qualcosa in background senza ottenere nohup.out:

 nohup command |tee & 

In questo modo, sarà ansible ottenere l’output della console durante l’esecuzione di script sul server remoto: inserisci la descrizione dell'immagine qui

puoi fare sotto nohup &> 2> & 1 & eg io non ho il comando hup all’interno dello script ./Runjob.sh> sparkConcuurent.out 2> & 1