TL; DR: użycie sudo -b
lub 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 sudo
z domyślną konfiguracją, jeśli ostatnio nie wprowadziłeś hasła sudo
w 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 sudo
ma nowy znacznik czasu.
Możesz upewnić się, że sudo
ma 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ć sudo
się na pierwszym planie, ale przekazać -b
flagę, dzięki sudo
czemu 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 -b
nie masz kontroli zadań , ale w skrypcie powłoki kontrola zadań jest domyślnie wyłączona i zwykle nie powinieneś jej używać .
Jak man sudo
wyjaś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
.
openvpn
będzie działał automatycznie w tle, jeśli uruchomisz go z --daemon
opcją:
sudo openvpn ~/my_connection.ovpn --daemon
Przechodzić --daemon
po .opvn
nazwie pliku raczej niż przedtem; argument --daemon
, jeśli występuje, jest interpretowany jako nazwa, której openvpn
powinien 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 openvpn
uruchomieniu, ale przed demonizacją. I to zależy częściowo od tego, co jest ustawione ~/my_connection.ovpn
. Ale jeśli openvpn
nie 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 --daemon
opcją. Jest to specyficzne dla - openvpn
większość programów nie obsługuje tej --daemon
opcji, 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 openvpn
podrę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ąć sudo
z 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 sudo
i nie potrzebuje hasło, aby to zrobić. Więc jeśli zrobić instancje urlopu sudo
w skrypcie następnie to prawdopodobnie będzie nadal działać.)
Jeśli masz jakieś sudo
skrypty, 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 openvpn
z --daemon
opcją.