Einen Prozess starten, in zu Gehen und trennen Sie es
Brauche ich einen neuen Prozess starten im Gehen mit den folgenden Anforderungen:
- Der Startvorgang soll ausgeführt werden, auch nach dem Go-Prozess beendet
- Ich muss in der Lage sein, die Unix-Benutzer - /Gruppe ausgeführt wird, die es
- Ich muss in der Lage sein, um die Umgebungsvariablen vererbt
- Ich brauche Kontrolle über die std-in/out/err
Hier ist ein Versuch:
var attr = os.ProcAttr {
Dir: "/bin",
Env: os.Environ(),
Files: []*os.File{
os.Stdin,
"stdout.log",
"stderr.log",
},
}
process, err := os.StartProcess("sleep", []string{"1"}, &attr)
Dies funktioniert gut, hat aber folgende Mängel, die aus den Anforderungen:
- Keine Möglichkeit, Unix-Benutzer - /Gruppen -
- Gestarteten Prozess endet, wenn der Go-Prozess (parent) hält
Diese muss auf Linux laufen nur, wenn das vereinfacht die Dinge.
- Es sieht aus wie, was Sie tun möchten, ist zu Gabel Prozess. Gibt es Einschränkungen dabei in einem Go-Programm Finden Sie in dieser Ausgabe: code.google.com/p/go/issues/detail?id=227
- Sie können nicht wirklich
fork()
im Gehen, insbesondere, wenn die runtime läuft. Der Kind-Prozess sollte die Führung der Ablösung von den Eltern, oder verwenden Sie einen wrapper wiestart-stop-daemon
.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine funktionierende version von deinem Beispiel (ich habe nicht überprüfen, ob die Prozess-ID ist, wo eigentlich der Satz),
Was ich gefunden habe, scheint zu funktionieren cross-Plattform ist es, führen Sie das Programm erneut mit einem speziellen flag. In Ihrem main-Programm, überprüfen Sie dieses flag. Wenn auf Start, du bist in der "Gabel". Wenn nicht, wiederholen Sie den Befehl mit der fahne.
Dieser wird einfach neu starten Sie Ihren Prozess mit der genauen Parameter und fügen Sie
--detached
auf die Argumente. Wenn Ihr Programm gestartet wird, überprüfen Sie für die--detached
Flagge zu wissen, wenn Sie anrufen müssenrerunDetached
oder nicht. Dies ist wie eine Art poor mansfork()
die Arbeit wird auf verschiedene OS.