TL; DR: Usare sudo -b
o, meglio, .openvpn [...] --daemon
Poiché stai eseguendo openvpn
(e, in particolare, poiché desideri eseguire un programma come root in background), le informazioni più comunemente dispensate su come eseguire i comandi in background non risolvono la tua situazione. Tu hai detto:
Ho provato ad aggiungere a & al comando cpenvpn e a posizionare nohop di fronte. Entrambi non funzionano.
Il tuo comando è:
sudo openvpn ~/my_connection.ovpn
Nella sudo
configurazione predefinita, se non hai inserito di recente la password sudo
nello stesso contesto (per uso interattivo, in genere questo significa lo stesso terminale), ti verrà chiesta la password. Ma se esegui il comando in background aggiungendo &
, non ti verrà mostrata la riga o ti verrà data la possibilità di digitarlo.[sudo] password for user:
Quindi, in questa situazione, eseguire il comando, inserire la password e inviarla in background in seguito è un modo ragionevole per farlo, per un uso interattivo .
Ma non è l'unico modo e, come dici tu, non vorrai farlo in una sceneggiatura .
Modo 1: assicurati di sudo
avere un nuovo timestamp.
Puoi assicurarti che sudo
abbia un timestamp corrente quando viene usato per eseguire il tuo comando, eseguendo prima:
sudo -v
Quindi, puoi eseguire:
sudo openvpn ~/my_connection.ovpn &
Tuttavia, in genere è meglio evitare &
(e nohup
) del tutto quando si desidera eseguire un comando in background con sudo
. Questo è particolarmente vero per gli script.
Modo 2: utilizzare sudo -b
. In generale, questo è di solito quello che vuoi.
Invece, puoi eseguirlo da sudo
solo in primo piano, ma passa la -b
bandiera in modo che sudo
il comando venga eseguito in background.
sudo -b openvpn ~/my_connection.ovpn
Questo di solito è un modo migliore, specialmente se stai inserendo il comando in uno script. Con sudo -b
te non ottieni il controllo del lavoro , ma in uno script di shell il controllo del lavoro è disabilitato di default e di solito non dovresti usarlo .
Come man sudo
spiega:
-b, --background
Run the given command in the background. Note that it is not
possible to use shell job control to manipulate background
processes started by sudo. Most interactive commands will
fail to work properly in background mode.
Questo funziona perché nulla è in esecuzione in background fino a quando sudo non ha ricevuto la tua password (se necessario) e ha stabilito che ti è permesso eseguire il comando.
Modo 3: Ma per openvpn
, probabilmente dovresti semplicemente eseguirlo --daemon
.
openvpn
verrà eseguito automaticamente in background se lo esegui con l' --daemon
opzione:
sudo openvpn ~/my_connection.ovpn --daemon
Passa --daemon
dopo il tuo .opvn
nome file anziché prima; l'argomento seguente --daemon
, se presente, viene interpretato come il nome che il openvpn
processo daemonizzato dovrebbe usare. (Do non anche di aggiunta &
.)
Se questo è appropriato o meno dipende dal fatto che debba avvenire o meno un'interazione dopo l' openvpn
esecuzione, ma prima che venga demonizzata. E ciò dipende, in parte, da ciò che è impostato in ~/my_connection.ovpn
. Ma se openvpn
non è possibile eseguire immediatamente il daemonize, anche tutti gli altri modi per eseguirlo immediatamente in background si romperanno .
Pertanto, in ogni situazione in cui si sa che si desidera openvpn
per avviare in esecuzione in background, e sai che non si vuole riportarlo in primo piano, si dovrebbe prendere in seria considerazione il metodo di invocare con l' --daemon
opzione. Questo è specifico per - la openvpn
maggior parte dei programmi non supporta --daemon
un'opzione, sebbene molti programmi server abbiano tale opzione. (Tuttavia, il nome e la sintassi variano.)
Per decidere se utilizzare o meno questa opzione (e come si desidera utilizzarla), ti consiglio di leggere la openvpn
pagina del manuale , in particolare nella sezione su --daemon
. Ha molte informazioni utili e sto solo citando il primo paragrafo qui:
--daemon [progname]
Become a daemon after all initialization functions are
completed. This option will cause all message and error output
to be sent to the syslog file (such as /var/log/messages),
except for the output of scripts and ifconfig commands, which
will go to /dev/null unless otherwise redirected. The syslog
redirection occurs immediately at the point that --daemon is
parsed on the command line even though the daemonization point
occurs later. If one of the --log options is present, it will
supercede syslog redirection.
The optional progname parameter [...]
Modo 4 : a volte è ragionevole eseguire l'intero script come root.
Se si dispone di uno script che esegue più azioni come root, non ha alcuna attività significativa che potrebbe ragionevolmente essere eseguita non come root, e non c'è mai nulla di utile da eseguire eseguendo lo script come utente non root, quindi il l'utente dello script dovrebbe probabilmente eseguirlo come root.
In questo caso, è necessario rimuovere sudo
dai comandi nello script. Quando lo script viene eseguito come root, non è necessario sudo
. (Anche se l'utente può radice, per impostazione predefinita, eseguire qualsiasi comando come qualsiasi utente compreso se stesso con sudo
e non ha bisogno di una password per farlo. Quindi, se fate le istanze di permesso di sudo
nello script allora sarà probabilmente ancora il lavoro.)
Se sudo
nello script sono presenti istanze di effettivamente utilizzate per eseguire comandi come utenti diversi da root (con ), è consigliabile conservare tali istanze.-u user
Se l'intero script viene eseguito come root, si applicano la maggior parte dei modi tipici di eseguire i comandi in background , incluso l'aggiunta &
e, se necessario, l'uso di nohup
(di cui già si conosce). Per questo, tuttavia, dovresti comunque considerare fortemente l'utilizzo openvpn
con l' --daemon
opzione.