TL; DR: Use sudo -b
ou melhor, openvpn [...] --daemon
.
Como você está executando openvpn
(e, menos especificamente, desde que deseja executar um programa como root em segundo plano), as informações mais comumente fornecidas sobre como executar comandos no o fundo não resolve sua situação. Você disse:
Eu tentei anexar um & amp; para o comando cpenvpn e colocar nohop em frente dela. Ambos não funcionam.
Seu comando é:
sudo openvpn ~/my_connection.ovpn
Abaixo da configuração padrão de sudo
, se você não tiver digitado sua senha recentemente para sudo
no mesmo contexto (para uso interativo, normalmente isso significa o mesmo terminal), ela solicitará sua senha. Mas se você executar o comando em segundo plano adicionando &
, você não verá a linha [sudo] password for user:
ou terá a oportunidade de digitá-la.
Então, nessa situação, executar o comando, digitar sua senha e enviá-lo para o segundo plano depois é uma maneira razoável de fazê-lo, para uso interativo .
Mas não é a única maneira e, como você diz, você não vai querer fazer isso em um script .
Caminho 1: Verifique se sudo
tem um novo registro de data e 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
) quando você deseja executar um comando em segundo plano com sudo
. Este é especialmente o caso dos scripts.
Caminho 2: Use sudo -b
. Em geral, geralmente é isso que você quer.
Em vez disso, você pode executar sudo
em si mesmo em primeiro plano, mas passar o -b
flag, então sudo
faz com que o comando seja executado em segundo plano.
sudo -b openvpn ~/my_connection.ovpn
Esta é geralmente uma maneira melhor, especialmente se você estiver colocando o comando em um script. Com sudo -b
você não obtém controle de trabalho , mas em um controle de trabalho shell script está desabilitado por padrão e você não deve usá-lo normalmente .
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é que após sudo tenha recebido sua senha (se necessário) e determinado que você tenha permissão para executar o comando.
Way 3: Mas para openvpn
, provavelmente você deve apenas executá-lo com --daemon
.
openvpn
será executado em segundo plano automaticamente se você executá-lo com a opção --daemon
:
sudo openvpn ~/my_connection.ovpn --daemon
Passe --daemon
após o nome do arquivo .opvn
em vez de antes; o argumento após --daemon
, se houver, é interpretado como o nome que o processo daemonized openvpn
deve usar. (Não também acrescenta &
.)
O fato de isso ser apropriado ou não depende de se alguma interação deve ou não ocorrer depois que openvpn
foi executado, mas antes de ser daemonizado. E isso depende, em parte, do que está configurado em ~/my_connection.ovpn
. Mas, se se openvpn
não puder ser imediatamente daemonizado, todas as outras formas de executá-lo imediatamente em segundo plano também serão quebradas .
Portanto, em qualquer situação em que você saiba que deseja que openvpn
inicie em execução em segundo plano, e você sabe que não vai querer trazê-lo de volta ao primeiro plano, deve considerar o método de invocá-lo com a opção --daemon
. Isso é específico para openvpn
- a maioria dos programas não oferece suporte à opção --daemon
, embora muitos programas de servidor tenham essa opção. (O nome e a sintaxe variam, no entanto.)
Para decidir se deve ou não usar essa opção (e como você deseja usá-la), recomendo que você leia a página de manual openvpn
, especialmente na seção --daemon
. Tem muita informação útil, 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 [...]
Way 4 : Às vezes é razoável executar o script inteiro como root.
Se você tem um script que realiza várias ações como root, ele não tem nenhuma atividade significativa que seria razoavelmente executada não como root, e nunca há nada útil em executar o script como um usuário não-root, o usuário do script provavelmente deve apenas executá-lo como root.
Se este for o caso, você deve remover sudo
dos comandos no script. Quando o script é executado como root, não há necessidade de sudo
. (Embora o usuário root possa, por padrão, executar qualquer comando como qualquer usuário, incluindo-se com sudo
e não precise de uma senha para fazê-lo. Então, se fizer , deixar instâncias de sudo
no script, provavelmente ainda funcionará.)
Se você tiver instâncias de sudo
no script que são realmente usadas para executar comandos como algum outro usuário além da raiz (com -u user
), você ainda deve manter essas instâncias.
Se todo o script estiver sendo executado como root, a maioria dos os típicos as formas de executar comandos em segundo plano se aplicam, incluindo o acréscimo de &
e, quando necessário, o uso de nohup
(que você já conhece). Para isso, no entanto, você deve considerar ainda usar openvpn
com a opção --daemon
.