У меня есть программа в/home/я/bin/foo, обычно составляется из:
// 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;
}
Когда я запускаю программу из каталога в режиме непривилегированного пользователя, файлбар.txtсоздан с/домой/янаписано внутри, что работает отлично..
.. до сих пор мой файл конфигурации upstart в/etc/initвыглядит следующим образом:
start on started tty2
exec /home/me/bin/foo
когда я перезапускаю tty2, файл/home/me/bin/bar.txtхорошо сделано, но внутри ничего не написано.
Я пытался написать что-то другое, чемgetenv("ДОМОЙ"), как простая строка, но все равно ничего.
Почему это происходит? Что мне делать?
обновление.1 : Через несколько часов я заметил, что мой указатель на файл не был обработан должным образом. В любом случае, за исключением этого маленького недоразумения, эти изменения не решили мою проблему. У меня по-прежнему ничего нет в файле, когда я пишуgetenv("ДОМОЙ"). Почему ? процесс выполняется как root и getenv("HOME") предназначен для записи по крайней мере '/корень'
решение1
Команды, выполняемые Upstart, не имеют переменной среды HOME.
Я использовал upstart-socket-bridge в несвязанном проекте для вывода переменных среды (usb добавляет несколько специальных переменных)
/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-сервер:
#!/bin/sh
outfile=/tmp/outfile
date > $outfile # Timestamp
printenv >> $outfile
exit 0
Запустить задание:
$ nc localhost 34567
А выходной список переменных среды выглядит так:
$ 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