我有一個程序/home/me/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是用創建的/家/我寫在裡面,效果很好。
..到目前為止我的新貴配置文件在/etc/初始化看起來像下面這樣:
start on started tty2
exec /home/me/bin/foo
當我重新啟動 tty2 時,該文件/home/me/bin/bar.txt創作得很好,但裡面什麼也沒寫。
我嘗試過寫一些其他的東西取得環境(「家」),就像一個基本字串,但仍然什麼都沒有。
為什麼會這樣呢?我該怎麼辦 ?
更新1: 幾個小時後,我才注意到我指向文件的指標沒有正確處理。當我寫入時,文件中仍然沒有任何內容取得環境(「家」)。為什麼 ?該進程以 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/套接字伺服器:
#!/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