나는 프로그램을 가지고있다./집/나/빈/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으로 생성됩니다/집/나안에 써있는데 잘 되더라구요..
.. 지금까지 내 신생 구성 파일은 다음과 같습니다./etc/init다음과 같습니다:
start on started tty2
exec /home/me/bin/foo
tty2를 다시 시작하면 파일이/home/me/bin/bar.txt잘 만들어졌지만 안에는 아무것도 쓰여있지 않습니다.
다른거 쓰려고 했는데getenv("홈"), 기본 문자열과 비슷하지만 여전히 아무것도 아닙니다.
왜 그런 일이 일어나는 걸까요? 어떻게 해야 합니까?
업데이트.1: 몇 시간 후에 나는 파일에 대한 포인터가 제대로 처리되지 않았다는 것을 깨달았습니다. 어쨌든 약간의 오해를 제외하고는 변경 사항으로 문제가 해결되지 않았습니다. 글을 쓸 때 아직 파일에 아무것도 없습니다getenv("홈"). 왜 ? 프로세스는 루트로 실행되고 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/소켓 서버:
#!/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