TL; DR: Use sudo -b
ou, melhor ,.openvpn [...] --daemon
Como você está executando openvpn
(e, menos especificamente, porque deseja executar um programa como raiz em segundo plano), as informações mais comuns sobre como executar comandos em segundo plano não tratam da sua situação. Você disse:
Eu tentei anexar um & ao comando cpenvpn e colocar nohop na frente dele. Ambos não funcionam.
Seu comando é:
sudo openvpn ~/my_connection.ovpn
Sob sudo
a configuração padrão, se você não tiver digitado sua senha recentemente sudo
no mesmo contexto (para uso interativo, normalmente significa o mesmo terminal), será solicitada sua senha. Mas se você executar o comando em segundo plano anexando &
, não será mostrada a linha ou terá a oportunidade de digitá-la.[sudo] password for user:
Portanto, nessa situação, executar o comando, digitar sua senha e enviá-la para segundo plano posteriormente é uma maneira razoável de fazê-lo, para uso interativo .
Mas não é o único caminho e, como você diz, não vai querer fazer isso em um script .
Caminho 1: verifique se sudo
há um novo carimbo de data / hora.
Você pode garantir que sudo
tenha um registro de data e hora atual quando for usado para executar seu comando, executando primeiro:
sudo -v
Depois disso, você pode executar:
sudo openvpn ~/my_connection.ovpn &
No entanto, geralmente é melhor evitar &
(e nohup
) completamente quando você deseja executar um comando em segundo plano com sudo
. Este é especialmente o caso dos scripts.
Caminho 2: Use sudo -b
. Em geral, isso geralmente é o que você deseja.
Em vez disso, você pode executar- sudo
se em primeiro plano, mas passar o -b
sinalizador para sudo
que o comando seja executado em segundo plano.
sudo -b openvpn ~/my_connection.ovpn
Geralmente, é uma maneira melhor, especialmente se você estiver colocando o comando em um script. Com sudo -b
você não obtém controle do trabalho , mas em um script de shell o controle do trabalho é desativado por padrão e você normalmente não deve usá-lo .
Como man sudo
explica:
-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.
Isso funciona porque nada está sendo executado em segundo plano até depois sudo tem recebido sua senha (se necessário) e determinou que você tem permissão para executar o comando.
Caminho 3: Mas openvpn
, provavelmente você deve executá-lo com --daemon
.
openvpn
será executado em segundo plano automaticamente se você o executar com a --daemon
opção:
sudo openvpn ~/my_connection.ovpn --daemon
Passe --daemon
depois do .opvn
nome do arquivo e não antes; o argumento a seguir --daemon
, se houver, é interpretado como o nome que o openvpn
processo daemonized deve usar. (Do não também acrescentar &
.)
Se isso é apropriado ou não, depende se alguma interação deve ou não ocorrer após a openvpn
execução, mas antes da daemon. E isso depende, em parte, daquilo que está configurado ~/my_connection.ovpn
. Mas se openvpn
não pudermos daemonizar imediatamente, todas as outras maneiras de executá-lo imediatamente em segundo plano também serão interrompidas .
Portanto, em qualquer situação onde você sabe que você quer openvpn
para começar a correr em segundo plano, e você sabe que você não vai querer trazê-lo de volta para o primeiro plano, você deve considerar fortemente o método de invocá-lo com a --daemon
opção. Isso é específico para a openvpn
maioria dos programas não suporta uma --daemon
opção, embora muitos programas de servidor possuam essa opção. (O nome e a sintaxe variam, no entanto.)
Para decidir se deve ou não usar esta opção (e como você deseja usá-la), recomendo que você leia a openvpn
página de manual , especialmente na seção --daemon
. Tem muitas informações úteis, e estou apenas citando o primeiro parágrafo aqui:
--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 [...]
Caminho 4 : Às vezes, é razoável executar o script inteiro como root.
Se você possui um script que executa várias ações como raiz, ele não possui nenhuma atividade significativa que seria razoavelmente executada e não como raiz, e nunca há nada de útil em executar o script como um usuário não raiz, então o O usuário do script provavelmente deve apenas executá-lo como root.
Se for esse o caso, você deve remover sudo
dos comandos no script. Quando o script é executado como root, não há necessidade sudo
. (Embora a lata usuário root, por padrão, execute qualquer comando como qualquer usuário, incluindo-se com sudo
e não precisa de uma senha para fazê-lo. Então, se você fazer casos de licença de sudo
no script, então ele provavelmente ainda trabalho.)
Se houver alguma instância do sudo
script que seja realmente usada para executar comandos como outro usuário que não seja root (with ), você ainda deverá manter essas instâncias.-u user
Se todo o script estiver sendo executado como raiz, aplica - se a maioria das maneiras típicas de executar comandos em segundo plano , incluindo anexar &
e, quando necessário, o uso de nohup
(que você já conhece). Para isso, no entanto, você ainda deve considerar fortemente o uso openvpn
com a --daemon
opção