TL; DR: Использование sudo -b
или, лучше, .openvpn [...] --daemon
Поскольку вы работаете openvpn
(и, реже, поскольку вы хотите запускать программу от имени пользователя root в фоновом режиме), наиболее распространенная информация о том, как выполнять команды в фоновом режиме, не решает вашу ситуацию. Вы сказали:
Я попытался добавить команду & к команде cpenvpn и поставить перед ней nohop. Оба не работают.
Ваша команда:
sudo openvpn ~/my_connection.ovpn
В sudo
конфигурации по умолчанию, если вы недавно не вводили свой пароль sudo
в том же контексте (для интерактивного использования обычно это означает тот же терминал), он запросит ваш пароль. Но если вы запустите команду в фоновом режиме, добавив ее, &
вам не будет показана строка или предоставлена возможность ввести ее.[sudo] password for user:
Таким образом, в этой ситуации выполнение команды, ввод пароля и последующая отправка его в фоновый режим - разумный способ сделать это для интерактивного использования .
Но это не единственный способ, и, как вы говорите, вы не захотите делать это в сценарии .
Способ 1: убедитесь, что у вас sudo
есть новая отметка времени.
Вы можете убедиться, что у вас sudo
есть текущая временная метка, когда она используется для запуска вашей команды, сначала запустив:
sudo -v
Затем, после этого, вы можете запустить:
sudo openvpn ~/my_connection.ovpn &
Однако, как правило, лучше избегать &
(и nohup
) вообще, когда вы хотите выполнить команду в фоновом режиме sudo
. Это особенно касается сценариев.
Способ 2: использование sudo -b
. В общем, обычно это то, что вы хотите.
Вместо этого вы можете запустить sudo
себя на переднем плане, но передать -b
флаг, чтобы sudo
команда выполнялась в фоновом режиме.
sudo -b openvpn ~/my_connection.ovpn
Обычно это лучший способ, особенно если вы помещаете команду в сценарий. При этом sudo -b
вы не получаете контроль над заданиями , но в сценарии оболочки управление заданиями по умолчанию отключено, и вы обычно не должны его использовать .
Как man sudo
объясняет:
-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.
Это работает , потому что ничего не работает в фоновом режиме , пока после Суда не получил свой пароль (если необходимо) и определил , что вам разрешено запускать команду.
Способ 3: Но openvpn
, вероятно, вы должны просто запустить его --daemon
.
openvpn
будет работать в фоновом режиме автоматически, если вы запустите его с --daemon
параметром:
sudo openvpn ~/my_connection.ovpn --daemon
Передайте --daemon
после вашего .opvn
имени файла, а не до; следующий за ним аргумент --daemon
интерпретируется как имя, которое openvpn
должен использовать демонизированный процесс. (У не также Append &
.)
Уместно ли это, зависит от того, должно ли происходить какое-либо взаимодействие после того, как openvpn
оно было выполнено, но до того, как оно будет демонтировано. И это зависит, отчасти, от того, что установлено в ~/my_connection.ovpn
. Но если openvpn
не удалось немедленно демонизировать, то все другие способы немедленного запуска его в фоновом режиме также будут нарушены .
Таким образом, в любой ситуации , когда вы знаете , что вы хотите , openvpn
чтобы начать работать в фоновом режиме, и вы знаете , вы не хотите , чтобы вернуть его на передний план, вы должны серьезно рассмотреть способ вызова его с помощью --daemon
опции. Это относится к openvpn
- большинство программ не поддерживают --daemon
опцию, хотя многие серверные программы имеют такую опцию. (Однако название и синтаксис могут быть разными.)
Для того, чтобы решить , следует ли использовать эту опцию (и как вы хотите использовать), я рекомендую вам прочитать на openvpn
странице руководства , особенно в разделе --daemon
. В нем много полезной информации, и я цитирую только первый абзац здесь:
--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 [...]
Способ 4 : иногда разумно запускать весь скрипт от имени root.
Если у вас есть сценарий, который выполняет несколько действий от имени пользователя root, он не выполняет каких-либо значительных действий, которые могли бы разумно выполняться не от имени пользователя root, и при запуске сценария от имени пользователя без полномочий root ничего полезного не возникает, тогда Пользователь сценария, вероятно, должен просто запустить его от имени пользователя root.
Если это так, то вы должны удалить sudo
из команд в сценарии. Когда скрипт запускается от имени root, в этом нет необходимости sudo
. (Хотя корневой пользователь может, по умолчанию, выполнить любую команду как любой пользователь , включая себя sudo
и не нужен пароль , чтобы сделать это. Так что если вы делаете отпуска экземпляров sudo
в сценарии , то это, вероятно , все еще работает.)
Если у вас есть какие-либо экземпляры sudo
в сценарии, которые фактически используются для запуска команд от имени другого пользователя, кроме root (с ), то вам все равно следует сохранить эти экземпляры.-u user
Если весь сценарий выполняется от имени пользователя root, то применяется большинство типичных способов выполнения команд в фоновом режиме , включая добавление &
и, где необходимо, использование nohup
(о котором вы уже знаете). Для этого, тем не менее, вы все равно должны рассмотреть возможность использования openvpn
с этой --daemon
опцией.