TL; DR: Verwenden sudo -b
oder besser .openvpn [...] --daemon
Da Sie openvpn
ein 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 sudo
im 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 sudo
einen neuen Zeitstempel haben.
Sie können sicherstellen, dass sudo
bei 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 sudo
selbst im Vordergrund ausführen , aber das -b
Flag übergeben, sodass sudo
der 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 -b
Sie keine Auftragssteuerung , aber in einem Shell-Skript ist die Auftragssteuerung standardmäßig deaktiviert und Sie sollten sie normalerweise nicht verwenden .
Wie man sudo
erklä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 openvpn
solltest du es wahrscheinlich einfach mit laufen lassen --daemon
.
openvpn
wird automatisch im Hintergrund ausgeführt, wenn Sie die --daemon
Option verwenden:
sudo openvpn ~/my_connection.ovpn --daemon
Übergeben Sie --daemon
nach Ihrem .opvn
Dateinamen und nicht vorher. Das folgende Argument wird --daemon
, falls vorhanden, als der Name interpretiert, den der daemonisierte openvpn
Prozess verwenden soll. (Haben nicht auch append &
.)
Ob dies angemessen ist oder nicht, hängt davon ab, ob nach openvpn
der 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 openvpn
konnte 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
--daemon
openvpn
--daemon
Um zu entscheiden, ob Sie diese Option verwenden (und wie Sie sie verwenden möchten), empfehle ich Ihnen, die openvpn
Handbuchseite 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 sudo
Befehle 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, sudo
und dazu kein Kennwort benötigt. Wenn Sie also Instanzen von sudo
im Skript belassen, funktioniert es wahrscheinlich immer noch.)
Wenn Sie Instanzen von sudo
im 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 openvpn
der --daemon
Option in Betracht ziehen .