Eu tenho um programa em/home/me/bin/foo, normalmente compilado de:
// 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;
}
Quando executo o programa a partir do diretório no modo de usuário sem privilégios, o arquivobarra.txté criado com/casa/euescrito dentro, isso funciona bem ..
.. até agora meu arquivo de configuração inicial em/etc/initparece com o seguinte:
start on started tty2
exec /home/me/bin/foo
quando eu reinicio o tty2, o arquivo/home/me/bin/bar.txtestá bem criado, mas nada está escrito dentro.
Eu tentei escrever algo diferente degetenv("HOME"), como uma string básica, mas ainda nada.
Por que isso está acontecendo? O que devo fazer ?
atualização.1: Depois de algumas horas, percebi que meu ponteiro para o arquivo não foi tratado corretamente. De qualquer forma, exceto aquele pequeno mal-entendido, que as alterações não resolveram meu problema. Ainda não tenho nada no arquivo quando escrevogetenv("HOME"). Por que ? o processo é executado como root e getenv("HOME") destina-se a escrever pelo menos '/raiz'
Responder1
Os comandos executados pelo Upstart não possuem uma variável de ambiente HOME.
Usei upstart-socket-bridge em um projeto não relacionado para imprimir as variáveis de ambiente (usb adiciona algumas variáveis especiais)
/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
Acione o trabalho:
$ nc localhost 34567
E a lista de saída de variáveis de ambiente é semelhante a:
$ 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