10348


linux/unix の初学者です。よろしくお願いします。  
シェルに関する参考書を読んでいるとユーザーにはログインシェルが割り当てられると書かれています。このため /etc/profile,
それから~/.bash_profileのスクリプトがログインシェルの実行時に有効になるのですよね。(.bashrc との違いはよくわかってません。。)

ところで、そこまで読んでいてあることを思い出しました。  
確か、apacheなどのサーバーデーモンはログインされては困るということで、/sbin/nologin
を使っているとあちこちのウェブページに書かれていました。  
実際、/etc/passwd を読んでみると

[code]

    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
[/code]

と書かれているので、確かに nologin というシェルを指定しているのがわかりました。

ここで疑問があります。  
nologin
をログインシェルに指定した場合、ユーザーはログインできないのだとすると、ログインできないままデーモンなどのプログラムは環境変数をどのように取得しているのでしょうか。  
いまいちここのところを教えてくれるページを見つけられなかったので教えてもらえると嬉しいです。


CC BY-SA 3.0
2015-05-18T22:39:49.143
10338
2015-05-20T22:09:54.730
2015-05-19T00:05:43.180
9403
9403
question
linux
/sbin/nologin を使うプロセスの環境変数


親プロセスの環境が引き継がれるのではないでしょうか。

OS の起動システムが SysVinit だと、httpd は以下の流れで起動し、途中のシェルスクリプトで環境変数が追加／削除されます。

> /sbin/init → /etc/rc.d/rc → /etc/init.d/httpd → /usr/sbin/httpd

稼働中のプロセスの環境変数は /proc/PID/environ を見るとわかります。

`# cat /proc/941/environ | tr '\0' '\n'`


CC BY-SA 3.0
2015-05-19T02:03:25.110
10348
2015-05-19T02:03:25.110
4603
10338
answer


環境変数というものの理解にそもそも誤解があるように思います。  
環境変数を実現しているのはOSであってシェルではありません。  
OSがプロセスを複製するとき、一緒にコピーされる変数を環境変数と呼びます。  
なので、どんなプロセスにも環境変数はあります。  
シェルで環境変数を操作する手段が豊富に用意されているのは、シェルが起動するプロセス（＝コマンド）に対して変数を引き渡す必要があるからです。


CC BY-SA 3.0
2015-05-20T22:09:54.730
10435
2015-05-20T22:09:54.730
8136
10338
answer