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параметром.