Starten Sie den Stunnel-Dienst beim Booten

2

Ich habe einen Dienst unter Homebrew gelaufen. Dieser Dienst wird einfach durch Ausführen des Befehls gestartet

sudo stunnel

Ich brauche diesen Befehl, um beim Booten ausgeführt zu werden, also habe ich einen LaunchDaemon erstellt, aber er funktioniert nicht. Hier ist die launchd-Datei:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple$
<plist version="1.0">
   <dict>
   <key>Label</key>
   <string>com.stunnel.stunnelstartup.plist</string>
   <key>ProgramArguments</key>
   <array>
          <string>/bin/sh</string>
          <string>/usr/local/etc/stunnel/startup.sh</string>
   </array>
   <key>UserName</key>
   <string>ROOT</string>
   <key>RunAtLoad</key>
   <true/>
   <key>KeepAlive</key>
   <false/>
</dict>
</plist>

Und hier ist das Shell-Skript:

#!/bin/bash
#stunnel startup
sleep 30 #Delay added for the system to boot properly
sudo stunnel

Was mache ich falsch???

EDIT: Ich habe getan, was alle Antworten bisher vorgeschlagen haben, mit immer noch ohne Glück. Hier ist meine neue Startdatei:

Ich habe auch die Stunnel-Konfiguration bearbeitet, damit sie nicht im Hintergrund ausgeführt wird

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple$
<plist version="1.0">
   <dict>
   <key>Label</key>
   <string>com.stunnel.stunnelstartup.plist</string>
   <key>Program</key>
   <string>/usr/local/bin/stunnel</string>
   <key>UserName</key>
   <string>root</string>
   <key>RunAtLoad</key>
   <true/>
   <key>AbandonProcessGroup</key>
   <false/>
</dict>
</plist>
Skyler 440
quelle

Antworten:

2

Es sieht so aus, als ob die stunnelHintergründe selbst, dh ein Unterprozess wird aufgefordert, die eigentliche Arbeit im Hintergrund auszuführen, und dann beendet werden. Wenn ein launchdverwalteter Prozess beendet wird, werden launchdstandardmäßig alle verbleibenden Unterprozesse automatisch abgebrochen ... wie der Hintergrundprozess stunnel. Ich habe diese nicht getestet, aber es gibt zwei einfache Möglichkeiten, um dies zu vermeiden.

Zunächst können Sie festlegen , dass übrig gebliebene Unterprozesse launchd nicht<key>AbandonProcessGroup</key><true/> abgebrochen werden sollen, indem Sie sie zur .plist hinzufügen.

Zweitens können Sie festlegen stunnel, dass kein Hintergrund erstellt werden soll, indem Sie foreground = yesder Konfigurationsdatei hinzufügen . Wenn Sie die zweite Option <key>KeepAlive</key><false/>ausführen, können Sie wahrscheinlich auch von Ihrer .plist entfernen und launchdden stunnelDämon ordnungsgemäß verwalten lassen .

[Update] Wenn das und Marks Vorschläge nicht funktionieren, empfehle ich, eine Debug-Ausgabe in das Skript aufzunehmen und diese und die Ausgabe von stunnel an eine Protokolldatei zu senden . Etwas wie das:

#!/bin/bash
#stunnel startup
exec >/tmp/stunnel.log 2>&1 # Send all output to a debug log
sleep 30 #Delay added for the system to boot properly
echo "$(date) - Starting stunnel"
sudo /path/to/stunnel
echo "$(date) - stunnel exited with status $?"
echo

Sie können ähnliche Aktionen ausführen, indem Sie StandardOutPathund StandardErrorPathkeys hinzufügen. In diesem Fall ist es jedoch einfacher, das Skript zu bearbeiten.

Gordon Davisson
quelle
@ Skyler440: D'oh! Ich habe den AbandonProcessGroupSchlüssel verkehrt herum bekommen, es sollte wahr sein, nicht falsch. Ich habe auch einen Vorschlag zum Erfassen der Debug-Ausgabe von Skript und Stunnel hinzugefügt
Gordon Davisson,
1

Es gibt einige Dinge, die hier überprüft werden müssen, aber dies ist keine direkte Antwort, da möglicherweise nicht alle hier das Problem sind.

Ein funktionierendes Beispiel für Macports finden Sie hier

  1. Wo sich stunnel befindet, ist der Pfad in launchd nicht derselbe wie in einer Terminalsitzung
  2. Sie können sudo nicht im Skript haben, da es von root ausgeführt wird. In diesem Fall brauchen Sie das Skript jedoch nicht, sondern führen die ausführbare Datei direkt aus
  3. Der Benutzername lautet root, nicht ROOT
  4. Wo legen Sie die plist-Datei ab?

Ich würde auch vorschlagen, dass ein Daemon nicht beim Start ausgeführt werden sollte, sondern nur, wenn eine Verbindung über einen Socket eingeht, aber das scheint so betäubt zu sein, dass es kein Installationsproblem darstellt

Obwohl ich diese andere Antwort sehe, bin ich überrascht, dass die Beispiel-Plist-Dateien, die ich gesehen habe, funktionieren (und mein letzter Kommentar ist relevanter)

Kennzeichen
quelle
Ich habe die plist-Datei in / library / LaunchDaemons
Skyler 440
Der Grund, warum ich ein Skript ausgeführt habe, ist, dass wenn stunnel versucht, zu früh zu starten, das Skript dies durch eine Verzögerung beim Booten des Systems ausgleicht
Skyler 440
Ich habe keine Ahnung, wo sich der Tunnelpfad befindet oder wie ich ihn finde. Alles was ich weiß ist, dass wenn du sudo stunnel von irgendwo aus startest, stunnel
Skyler 440
und das Problem ist, dass der Pfad in terminal und launchd unterschiedlich ist, so dass man ihn finden kann und der andere nicht, so dass Sie dies wissen müssen. versuchen Sie es type -p stunnelzu finden
Mark
Danke, ich habe den Weg gefunden. Ich habe alle Vorschläge ohne Glück ausprobiert. Siehe Bearbeiten
Skyler 440