Wie legen Sie die Umgebungsvariable in der vor-start im Upstart-Skript?
Wir haben einen benutzerdefinierten C++ - daemon Anwendung, die Gabeln einmal. So machen wir das schon in unserem Upstart-Skript auf Ubuntu 12.04 und es funktioniert perfekt:
expect fork
exec /path/to/the/app
Aber jetzt müssen wir ein argument übergeben, um unsere app enthält die Anzahl der CPUs auf dem Computer auf dem es läuft:
cat /proc/cpuinfo | grep processor | wc -l
Unser Erster Versuch war dieser:
expect fork
exec /path/to/the/app -t `cat /proc/cpuinfo | grep processor | wc -l`
Während das startet unser app-mit dem richtigen -t-Wert, Upstart tracks die falsche pid-Wert, ich gehe davon aus, weil diejenigen, cat, grep & wc-Befehle alle launch-Prozesse in exec, bevor Sie unsere app.
Habe ich auch dies ausprobiert, und ist es nicht auch Arbeit, ich denke, weil die Einstellung einer env-var läuft ein Prozess? Upstart noch tracks die falsche pid:
expect fork
script
NUM_CORES=32
/path/to/the/app -t $NUM_CORES
end script
Ich habe auch versucht, dies zu tun in einer env Strophe aber anscheinend diejenigen, die nicht Befehle ausführen:
env num_cores=`cat /proc/cpuinfo | grep processor | wc -l`
Habe auch versucht dies zu tun, in pre-start, aber die env-vars setzen, es müssen nicht alle Werte in der exec Strophe:
pre-start
NUM_CORES=32
end script
Irgendeine Idee, wie man diese NUM_CORES richtig eingestellt, und immer noch Upstart-track die richtige pid für unsere app, die Gabeln einmal?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist umständlich. Die empfohlene Methode ist, um schreiben Sie eine env-Datei, die in der pre-start Strophe und dann source im script Strophe. Es ist lächerlich, ich weiß.
Ich benutze die exec-Zeile in der pre-start, da ich in der Regel mehrere env-Variablen und das möchte ich nicht wiederholen die Umleitung code.
Das funktioniert nur, weil die '. ' - Befehl ist eine integrierte in-dash und somit kein Prozess erzeugt wird.
expect daemon
vielleicht angebracht gewesen.Laut zram-config ' s upstart config:
$()
Gabeln ein child-Prozess (und dann das Rohr bewirkt, dass eine andere Gabel), die verwirren können Sie die Gabel verfolgen. Wenn Sie die Gabel mehr als zweimal, bevor Sie Ihre eigentlichen daemon, ältere Schnösel kann nicht verfolgen Sie den Dämon-Prozess und dann respawn wird nicht richtig funktionieren. Dies funktioniert für zram-config, weil das nur einmal ausgeführt und braucht nicht respawnen, aber es ist nicht universal. 🙂 Das ist der Grund, warum @mpm Antwort notwendig ist.Ich würde hinzufügen
nach der Zuordnung Wert in "Skript". Ich erinnere mich, dass ein /bin/sh symlinked auf eine nicht-Bash-shell Skripte auszuführen, so würde ich vermeiden, Bash-nur Konstrukte.
Re: mit den "env" - Strophe, es übergibt die Werte buchstäblich und nicht verarbeiten Sie die Verwendung von shell-Konventionen.