起動、バックグラウンド、およびサービスプロセスにどのような環境と資格情報が使用されますか?

起動、バックグラウンド、およびサービスプロセスにどのような環境と資格情報が使用されますか?
  • 起動スクリプト(起動時)
  • バックグラウンドで実行中(または送信された)プロセス(例:SSH -fNを使用する場合)
  • 提供する
  • など。

彼らはどの$path変数を使用しますか?どの文書?私が知っておくべき他のものがありますか?

インターネット検索を試み、フォーラムで散らばっている多くの情報を見つけましたが、何が起こっているのかについて明確で完全な説明を提供する情報はありません。

ちなみに、私はDebianとほぼ同じRaspbianを実行しています。

答え1

プロセスが開始される手順によっては、環境変数がまったくない場合、親プロセスから継承することも、開始(init.d)スクリプトの変数を使用することもできます。

以下を確認して、プロセスにどの環境変数があるかを確認できます/proc/$PID_OF_PROCESS/environ

root@frisbee:~# xargs -n 1 -0 < /proc/1243/environ 
UPSTART_INSTANCE=
UPSTART_JOB=rsyslog
TERM=linux
PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/sbin:/sbin:/bin
UPSTART_EVENTS=filesystem
PWD=/

そのディレクトリを調べると、プロセスに関する多くの情報を見つけることができます/proc/。たとえば、

  • プロセスの現在の作業ディレクトリは、次にシンボリックリンクされています/proc/$PID/cwd

    root@frisbee:~# ls -l /proc/1243/cwd
    lrwxrwxrwx 1 root root 0 apr 30 11:20 /proc/1243/cwd -> /
    
  • プロセスを持つバイナリへのシンボリックリンクはexec()次のとおりです/proc/$PID/exe

    root@frisbee:~# ls -l /proc/1243/exe
    lrwxrwxrwx 1 root root 0 apr 30 11:19 /proc/1243/exe -> /usr/sbin/rsyslogd
    
  • ファイルディスクリプタ(ファイル+ネットワーク接続+プロセス間通信ソケット)は、以下にあります/proc/$PID/fd/

    root@frisbee:/proc/1243/fd# ls -l
    total 0
    lrwx------ 1 root root 64 apr 30 11:20 0 -> socket:[12362]
    l-wx------ 1 root root 64 apr 30 11:20 1 -> /var/log/syslog
    l-wx------ 1 root root 64 apr 30 11:20 2 -> /var/log/kern.log
    lr-x------ 1 root root 64 apr 30 11:20 3 -> /proc/kmsg
    l-wx------ 1 root root 64 apr 30 11:20 4 -> /var/log/auth.log
    l-wx------ 1 root root 64 apr 30 11:39 5 -> /var/log/ufw.log
    

ps出力を調べて、プロセスがどのユーザーとして実行されているかを確認できます。

root@frisbee:/proc/1243# ps -fp 1243
UID        PID  PPID  C STIME TTY          TIME CMD
syslog    1243     1  0 11:19 ?        00:00:01 rsyslogd -c5

私が知っておくべき他のものがありますか?

多くはありますが、これらを直接定義して検索するか、他の関連する質問をする必要があります。

答え2

起動スクリプト(起動時)

プロセス開始日内部に通常、ほとんどないかまったくありません既存の環境ですが、呼び出し方法によって異なります。

直接呼び出される場合、つまりinitデーモンによって分岐および実行される場合は$PATH設定されません。シェルを介して呼び出されると、$PATHシェルと設定方法に応じて設定できますが、通常はまだ設定されていないため、initスクリプトには通常フルパスが含まれています。

このような環境変数は$PATH通常シェルスクリプトに設定され、シェルの起動時に自動的に取得できます。これを行う方法については、BashのINVOCATIONを参照してくださいman bash。非対話型で呼び出されたシェルsh(つまり、ほとんどのinitスクリプト)の場合、自動的に取得されたファイルはありません。

環境変数も継承されますが、init(システムの最初のプロセス)が一部の環境変数を設定しない限り、子プロセス(initスクリプトの実行など)は何も継承しません。

特定のブートサービスで特定の方法で環境を設定する必要がある場合は、その環境を独自に設定することはそのサービスの責任です。 従来、これはinitスクリプトで変数を初期化することによって行われます。

バックグラウンドで実行されている(または送信された)プロセス

プロセスは親プロセス(プロセスを開始したプロセス)から環境を継承します。バックグラウンドで送信しても変更されません。

関連情報