TL; DR: użycie sudo -blub lepiej .openvpn [...] --daemon
Ponieważ działasz openvpn(a dokładniej, ponieważ chcesz uruchomić program jako root w tle), najczęściej wydawane informacje o tym, jak uruchamiać polecenia w tle, nie dotyczą twojej sytuacji. Powiedziałeś:
Próbowałem dołączyć polecenie & do polecenia cpenvpn i umieścić przed nim nohop. Oba nie działają.
Twoje polecenie to:
sudo openvpn ~/my_connection.ovpn
Zgodnie sudoz domyślną konfiguracją, jeśli ostatnio nie wprowadziłeś hasła sudow tym samym kontekście (do użytku interaktywnego, zwykle oznacza to ten sam terminal), wówczas poprosi o podanie hasła. Ale jeśli uruchomisz polecenie w tle, dołączając &, nie zobaczysz wiersza ani nie będziesz mógł go wpisać.[sudo] password for user:
Tak więc w tej sytuacji uruchomienie polecenia, wpisanie hasła i wysłanie go w tle jest rozsądnym sposobem na zrobienie tego, do użytku interaktywnego .
Ale to nie jedyny sposób i, jak mówisz, nie będziesz chciał tego robić w skrypcie .
Sposób 1: Upewnij się, że sudoma nowy znacznik czasu.
Możesz upewnić się, że sudoma on bieżący znacznik czasu, gdy jest używany do uruchomienia polecenia, uruchamiając najpierw:
sudo -v
Następnie możesz uruchomić:
sudo openvpn ~/my_connection.ovpn &
Jednak zwykle lepiej jest całkowicie unikać &(i nohup), jeśli chcesz uruchomić polecenie w tle za pomocą sudo. Dotyczy to zwłaszcza skryptów.
Sposób 2: Użyj sudo -b. Zasadniczo tego właśnie chcesz.
Zamiast tego możesz uruchamiać sudosię na pierwszym planie, ale przekazać -bflagę, dzięki sudoczemu polecenie zostanie uruchomione w tle.
sudo -b openvpn ~/my_connection.ovpn
Jest to zwykle lepszy sposób, szczególnie jeśli wstawiasz polecenie w skrypcie. Gdy sudo -bnie masz kontroli zadań , ale w skrypcie powłoki kontrola zadań jest domyślnie wyłączona i zwykle nie powinieneś jej używać .
Jak man sudowyjaśnia:
-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.
To działa, ponieważ nic nie jest uruchomiony w tle, aż po sudo nie otrzymałem hasła (jeśli to konieczne) i stwierdziliśmy, że dopuszcza się, aby uruchomić polecenie.
Sposób 3: Ale po openvpn, prawdopodobnie powinieneś po prostu to uruchomić --daemon.
openvpnbędzie działał automatycznie w tle, jeśli uruchomisz go z --daemonopcją:
sudo openvpn ~/my_connection.ovpn --daemon
Przechodzić --daemonpo .opvnnazwie pliku raczej niż przedtem; argument --daemon, jeśli występuje, jest interpretowany jako nazwa, której openvpnpowinien użyć demonizowany proces. (Czy nie również append &).
To, czy jest to właściwe, zależy od tego, czy jakakolwiek interakcja musi nastąpić po openvpnuruchomieniu, ale przed demonizacją. I to zależy częściowo od tego, co jest ustawione ~/my_connection.ovpn. Ale jeśli openvpnnie da się natychmiast demonizować, wtedy wszystkie inne sposoby natychmiastowego uruchomienia go w tle również się zepsują .
Dlatego w każdej sytuacji, gdy wiesz, że chcesz openvpn, aby zacząć działać w tle, a wiesz, że nie będzie chciał go przywrócić na pierwszy plan, należy poważnie rozważyć metodę wywoływania go z --daemonopcją. Jest to specyficzne dla - openvpnwiększość programów nie obsługuje tej --daemonopcji, chociaż wiele programów serwerowych ma taką opcję. (Nazwa i składnia są jednak różne).
Aby zdecydować, czy skorzystać z tej opcji (i jak chcesz z niej skorzystać), zalecamy przeczytanie strony openvpnpodręcznika , szczególnie w sekcji na --daemon. Zawiera wiele użytecznych informacji i cytuję tutaj tylko pierwszy akapit:
--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 [...]
Sposób 4 : Czasami rozsądnie jest uruchomić cały skrypt jako root.
Jeśli masz skrypt, który wykonuje wiele działań jako root, nie ma on żadnej znaczącej aktywności, która byłaby rozsądnie uruchomiona nie jako root, i nigdy nie ma nic użytecznego po uruchomieniu skryptu jako użytkownik inny niż root. użytkownik skryptu powinien prawdopodobnie po prostu uruchomić go jako root.
W takim przypadku należy usunąć sudoz poleceń w skrypcie. Gdy skrypt działa jako root, nie ma takiej potrzeby sudo. (Chociaż użytkownik może korzeniowego, domyślnie uruchomić dowolną komendę jako dowolny użytkownik z tym sama sudoi nie potrzebuje hasło, aby to zrobić. Więc jeśli zrobić instancje urlopu sudow skrypcie następnie to prawdopodobnie będzie nadal działać.)
Jeśli masz jakieś sudoskrypty, które są faktycznie używane do uruchamiania komend jako użytkownik inny niż root (with ), powinieneś zachować te instancje.-u user
Jeśli cały skrypt jest uruchamiany jako root, wówczas stosuje się większość typowych sposobów uruchamiania poleceń w tle , w tym dołączanie &i, w razie potrzeby, użycie nohup(o których już wiesz). Do tego jednak, należy rozważyć użycie nadal silnie openvpnz --daemonopcją.