TL; DR: Використання sudo -b
або, краще, .openvpn [...] --daemon
Оскільки ви працюєте openvpn
(і, менш конкретно, оскільки ви хочете запустити програму як корінь у фоновому режимі), найчастіше розповсюджена інформація про те, як запускати команди у фоновому режимі, не стосується вашої ситуації. Ти сказав:
Я спробував додати команду & до команди 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.
Якщо це так, то вам слід видалити sudo
з команд у скрипті. Коли сценарій працює як root, немає необхідності в цьому sudo
. (Хоча кореневої користувач може, за замовчуванням, виконати будь-яку команду як будь-який користувач , включаючи себе sudo
і не потребує введення пароля , щоб зробити це. Так що якщо ви робите відпустки примірників sudo
в сценарії , то це, ймовірно , все ще працює.)
Якщо у вас є будь-які екземпляри sudo
в скрипті, які фактично використовуються для запуску команд як інший користувач, ніж root (з ), тоді ви все одно повинні зберігати ці екземпляри.-u user
Якщо весь сценарій запускається як root, то застосовуються більшість типових способів змусити команди виконуватись у фоновому режимі , включаючи додавання &
та, за необхідності, використання nohup
(про що ви вже знаєте). Для цього, однак, слід все-таки настійно розглянути можливість використання openvpn
з цим --daemon
параметром.