私はプログラムを持っています/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/init次のようになります:
start on started tty2
exec /home/me/bin/foo
tty2を再起動すると、ファイル/home/me/bin/bar.txtよく作成されていますが、中には何も書かれていません。
私は何か他のものを書こうとしましたgetenv("HOME")、基本的な文字列のようですが、それでも何もありません。
なぜそうなるのでしょうか?どうすればいいのでしょうか?
アップデート.1: 数時間後、ファイルへのポインタが適切に処理されていないことに気付きました。とにかく、その小さな誤解を除けば、その変更では問題は解決しませんでした。書き込むときにファイルにはまだ何も入っていません。getenv("HOME")なぜでしょうか? プロセスはルートとして実行され、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