TL; DR: Verwenden sudo -boder besser .openvpn [...] --daemon
Da Sie openvpnein Programm ausführen (und insbesondere ein Programm als Root im Hintergrund ausführen möchten ), sind die am häufigsten angegebenen Informationen zum Ausführen von Befehlen im Hintergrund nicht für Ihre Situation relevant. Du sagtest:
Ich habe versucht, ein & an den Befehl cpenvpn anzuhängen und nohop davor zu platzieren. Beides geht nicht.
Ihr Befehl lautet:
sudo openvpn ~/my_connection.ovpn
Unter sudo‚s Standardkonfiguration, wenn Sie nicht vor kurzem Ihr Passwort für eingegeben haben sudoim gleichen Kontext (für interaktive Nutzung, in der Regel diese Mittel das gleiche Terminal) dann wird es nach Ihrem Passwort fragen. Wenn Sie den Befehl jedoch im Hintergrund ausführen, indem &Sie ihn anhängen, wird Ihnen die Zeile nicht angezeigt und Sie haben nicht die Möglichkeit, sie einzugeben.[sudo] password for user:
In dieser Situation ist es daher sinnvoll, den Befehl auszuführen, das Kennwort einzugeben und es anschließend für die interaktive Verwendung in den Hintergrund zu senden .
Aber es ist nicht der einzige Weg und wie Sie sagen, werden Sie das nicht in einem Skript tun wollen .
Möglichkeit 1: Stellen Sie sicher, dass Sie sudoeinen neuen Zeitstempel haben.
Sie können sicherstellen, dass sudobei der Ausführung Ihres Befehls ein aktueller Zeitstempel angezeigt wird, indem Sie zunächst Folgendes ausführen:
sudo -v
Danach können Sie Folgendes ausführen:
sudo openvpn ~/my_connection.ovpn &
In der Regel ist es jedoch besser, &(und nohup) ganz zu vermeiden, wenn Sie einen Befehl im Hintergrund mit ausführen möchten sudo. Dies gilt insbesondere für Skripte.
Weg 2: Verwenden sudo -b. Im Allgemeinen ist dies normalerweise das, was Sie wollen.
Stattdessen können Sie sich sudoselbst im Vordergrund ausführen , aber das -bFlag übergeben, sodass sudoder Befehl im Hintergrund ausgeführt wird.
sudo -b openvpn ~/my_connection.ovpn
Dies ist normalerweise eine bessere Methode, insbesondere wenn Sie den Befehl in ein Skript einfügen. Mit erhalten sudo -bSie keine Auftragssteuerung , aber in einem Shell-Skript ist die Auftragssteuerung standardmäßig deaktiviert und Sie sollten sie normalerweise nicht verwenden .
Wie man sudoerklärt:
-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.
Das funktioniert , weil nichts im Hintergrund ausgeführt wird, bis nach sudo hat Ihr Passwort empfangen (falls erforderlich) und festgestellt , dass Sie den Befehl auszuführen sind zulässig.
Weg 3: Aber dafür openvpnsolltest du es wahrscheinlich einfach mit laufen lassen --daemon.
openvpnwird automatisch im Hintergrund ausgeführt, wenn Sie die --daemonOption verwenden:
sudo openvpn ~/my_connection.ovpn --daemon
Übergeben Sie --daemonnach Ihrem .opvnDateinamen und nicht vorher. Das folgende Argument wird --daemon, falls vorhanden, als der Name interpretiert, den der daemonisierte openvpnProzess verwenden soll. (Haben nicht auch append &.)
Ob dies angemessen ist oder nicht, hängt davon ab, ob nach openvpnder Ausführung, jedoch vor der Dämonisierung, eine Interaktion stattfinden muss . Und das hängt zum Teil davon ab, was in eingerichtet ist ~/my_connection.ovpn. Aber wenn openvpnkonnte nicht sofort daemonize, dann alle anderen Möglichkeiten, diese sofort im Hintergrund laufen bricht auch .
Daher ist in jeder Situation , wo Sie wissen , dass Sie starten im Hintergrund ausgeführt wird , und Sie wissen , dass Sie nicht wieder in den Vordergrund bringen wollen, sollten Sie in der Methode des Aufrufs mit der betrachten Option. Dies ist spezifisch für die meisten Programme, die keine Option unterstützen, obwohl viele Serverprogramme über eine solche Option verfügen. (Name und Syntax variieren jedoch.)openvpn--daemonopenvpn--daemon
Um zu entscheiden, ob Sie diese Option verwenden (und wie Sie sie verwenden möchten), empfehle ich Ihnen, die openvpnHandbuchseite zu lesen , insbesondere im Abschnitt über --daemon. Es enthält viele nützliche Informationen, und ich zitiere hier nur den ersten Absatz:
--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 [...]
Möglichkeit 4 : Manchmal ist es sinnvoll, das gesamte Skript als Root auszuführen.
Wenn Sie ein Skript haben, das mehrere Aktionen als root ausführt, hat es keine signifikante Aktivität, die vernünftigerweise nicht als root ausgeführt werden würde, und es ist nie sinnvoll, das Skript als Benutzer ohne root auszuführen Benutzer des Skripts sollten es wahrscheinlich nur als root ausführen.
In diesem Fall sollten Sie sudoBefehle aus dem Skript entfernen . Wenn das Skript als root ausgeführt wird, ist dies nicht erforderlich sudo. (Obwohl der Root-Benutzer standardmäßig jeden Befehl ausführen kann, wie jeder Benutzer, der sich selbst mit einschließt, sudound dazu kein Kennwort benötigt. Wenn Sie also Instanzen von sudoim Skript belassen, funktioniert es wahrscheinlich immer noch.)
Wenn Sie Instanzen von sudoim Skript haben, die tatsächlich zum Ausführen von Befehlen als ein anderer Benutzer als root (mit ) verwendet werden, sollten Sie diese Instanzen trotzdem beibehalten.-u user
Wenn das gesamte Skript als root ausgeführt wird, gelten die meisten typischen Methoden, um Befehle im Hintergrund auszuführen , einschließlich des Anhängens &und gegebenenfalls der Verwendung von nohup(die Sie bereits kennen). Zu diesem Zweck sollten Sie jedoch nach wie vor die Verwendung openvpnder --daemonOption in Betracht ziehen .