Ich habe ein Programm in/home/me/bin/foo, typischerweise zusammengestellt aus:
// includes
...
#define PATHNAME "/home/me/bin/bar.txt"
int main ()
{
FILE* f;
f = fopen(PATHNAME, "wb"); // I skip the possible error for freshness
fputs(getenv("HOME"), f);
fclose(f);
return 0;
}
Wenn ich das Programm aus dem Verzeichnis im nicht privilegierten Benutzermodus ausführe, wird die Dateibar.txtentsteht mit/home/ichinnen geschrieben, das funktioniert gut..
.. bis jetzt meine upstart Konfigurationsdatei in/etc/initsieht wie folgt aus:
start on started tty2
exec /home/me/bin/foo
wenn ich tty2 neu starte, die Datei/home/me/bin/bar.txtist gut gemacht, aber es steht nichts darin.
Ich habe versucht, etwas anderes zu schreiben alsgetenv("START"), wie eine einfache Zeichenfolge, aber immer noch nichts.
Warum passiert das? Was soll ich tun?
Aktualisierung.1: Nach ein paar Stunden bemerkte ich, dass mein Zeiger auf die Datei nicht richtig behandelt wurde. Abgesehen von diesem kleinen Missverständnis lösten diese Änderungen mein Problem jedoch nicht. Ich habe immer noch nichts in der Datei, wenn ich schreibegetenv("START"). Warum? Der Prozess wird als Root ausgeführt und getenv("HOME") soll mindestens '/Wurzel'
Antwort1
Von Upstart ausgeführte Befehle haben keine HOME-Umgebungsvariable.
Ich habe upstart-socket-bridge in einem anderen Projekt verwendet, um die Umgebungsvariablen auszudrucken (USB fügt einige spezielle Variablen hinzu).
/etc/init/socket-test.conf:
description "upstart-socket-bridge test"
start on socket PROTO=inet PORT=34567 ADDR=127.0.0.1
setuid my_username
exec /bin/sh /tmp/socket-server
/tmp/Socket-Server:
#!/bin/sh
outfile=/tmp/outfile
date > $outfile # Timestamp
printenv >> $outfile
exit 0
Lösen Sie den Job aus:
$ nc localhost 34567
Und die Ausgabeliste der Umgebungsvariablen sieht folgendermaßen aus:
$ cat /tmp/outfile
Wed Dec 11 07:23:50 CST 2013
UPSTART_INSTANCE=
PORT=34567
PROTO=inet
UPSTART_JOB=socket-test
UPSTART_FDS=12
TERM=linux
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
UPSTART_EVENTS=socket
PWD=/
ADDR=127.0.0.1