TL; DR: Utilisation sudo -b
ou mieux .openvpn [...] --daemon
Étant donné que vous exécutez openvpn
(et, plus précisément, puisque vous souhaitez exécuter un programme en tant que root en arrière-plan), les informations les plus communément distribuées sur la façon d'exécuter des commandes en arrière-plan ne répondent pas à votre situation. Tu as dit:
J'ai essayé d'ajouter un & à la commande cpenvpn et de placer nohop devant. Les deux ne fonctionnent pas.
Votre commande est:
sudo openvpn ~/my_connection.ovpn
Dans sudo
la configuration par défaut de, si vous n'avez pas récemment entré votre mot de passe sudo
dans le même contexte (pour une utilisation interactive, cela signifie généralement le même terminal), il vous demandera votre mot de passe. Mais si vous exécutez la commande en arrière-plan en l'ajoutant, &
la ligne ne vous sera pas montrée ni la possibilité de la saisir.[sudo] password for user:
Donc, dans cette situation, exécuter la commande, entrer votre mot de passe et l'envoyer en arrière-plan est une façon raisonnable de le faire, pour une utilisation interactive .
Mais ce n'est pas le seul moyen et, comme vous le dites, vous ne voudrez pas le faire dans un script .
Façon 1: assurez-vous d' sudo
avoir un nouvel horodatage.
Vous pouvez vous assurer qu'il sudo
a un horodatage actuel lorsqu'il est utilisé pour exécuter votre commande, en exécutant d'abord:
sudo -v
Ensuite, après cela, vous pouvez exécuter:
sudo openvpn ~/my_connection.ovpn &
Cependant, il est généralement préférable d'éviter &
(et nohup
) complètement lorsque vous souhaitez exécuter une commande en arrière-plan avec sudo
. C'est particulièrement le cas pour les scripts.
Méthode 2: utilisez sudo -b
. En général, c'est généralement ce que vous voulez.
Au lieu de cela, vous pouvez vous exécuter sudo
au premier plan, mais passer l' -b
indicateur sudo
entraîne l'exécution de la commande en arrière-plan.
sudo -b openvpn ~/my_connection.ovpn
C'est généralement un meilleur moyen, surtout si vous mettez la commande dans un script. Avec sudo -b
vous, vous n'obtenez pas le contrôle des travaux , mais dans un script shell, le contrôle des travaux est désactivé par défaut et vous ne devriez généralement pas l'utiliser .
Comme l' man sudo
explique:
-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.
Cela fonctionne car rien ne s'exécute en arrière-plan tant que sudo n'a pas reçu votre mot de passe (si nécessaire) et déterminé que vous êtes autorisé à exécuter la commande.
Way 3: Mais pour openvpn
, vous devriez probablement simplement l'exécuter avec --daemon
.
openvpn
s'exécutera automatiquement en arrière-plan si vous l'exécutez avec l' --daemon
option:
sudo openvpn ~/my_connection.ovpn --daemon
Passez --daemon
après votre .opvn
nom de fichier plutôt qu'avant; le --daemon
cas échéant, l'argument suivant est interprété comme le nom que le openvpn
processus démonisé doit utiliser. (N'ajoutez pas également &
.)
Le fait que cela soit approprié ou non dépend du fait qu'une interaction doit ou non se produire après openvpn
son exécution mais avant sa démonétisation. Et cela dépend, en partie, de ce qui est mis en place ~/my_connection.ovpn
. Mais si vous openvpn
ne pouvez pas démonifier immédiatement, toutes les autres façons de l'exécuter immédiatement en arrière-plan seront également interrompues .
Par conséquent, dans une situation où vous savez que vous voulez openvpn
pour commencer en cours d' exécution en arrière - plan, et vous savez que vous ne voudrez pas le ramener au premier plan, vous devriez sérieusement envisager la méthode de l' invoquer avec l' --daemon
option. Ceci est spécifique à - la openvpn
plupart des programmes ne prennent pas en charge une --daemon
option, bien que de nombreux programmes serveur aient une telle option. (Le nom et la syntaxe varient cependant.)
Pour décider d'utiliser ou non cette option (et comment vous souhaitez l'utiliser), je vous recommande de lire la openvpn
page de manuel , en particulier dans la section sur --daemon
. Il contient de nombreuses informations utiles, et je ne cite ici que le premier paragraphe:
--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 [...]
Méthode 4 : Parfois, il est raisonnable d'exécuter le script entier en tant que root.
Si vous avez un script qui exécute plusieurs actions en tant que root, il n'a aucune activité significative qui serait raisonnablement exécutée non en tant que root, et il n'y a jamais rien d'utile à venir de l'exécution du script en tant qu'utilisateur non root, alors le l'utilisateur du script devrait probablement l'exécuter en tant que root.
Si tel est le cas, vous devez supprimer sudo
des commandes du script. Lorsque le script s'exécute en tant que root, il n'est pas nécessaire de le faire sudo
. (Bien que la boîte utilisateur root, par défaut, exécutez une commande comme tout utilisateur , y compris lui - même avec sudo
et n'a pas besoin d' un mot de passe pour le faire. Donc , si vous faites cas de congé de sudo
dans le script , alors il sera probablement encore du travail.)
Si vous avez des instances de sudo
dans le script qui sont réellement utilisées pour exécuter des commandes en tant qu'utilisateur autre que root (avec ), vous devez toujours conserver ces instances.-u user
Si l'intégralité du script est exécuté en tant que root, la plupart des méthodes typiques pour exécuter des commandes en arrière-plan s'appliquent, y compris l'ajout &
et, si nécessaire, l'utilisation de nohup
(que vous connaissez déjà). Pour cela, cependant, vous devriez toujours envisager sérieusement openvpn
d' utiliser l' --daemon
option.