启动、后台、服务进程使用什么环境和凭证

启动、后台、服务进程使用什么环境和凭证
  • 启动脚本(启动时)
  • 在后台运行(或发送到)的进程(例如使用 SSH -fN 时)
  • 服务
  • ETC。

他们将使用什么 $path 变量?什么证件?还有什么我应该知道的吗?

尝试用谷歌搜索,并在论坛中发现了很多零散的信息,但没有任何内容可以清晰/完整地描述正在发生的事情。

仅供参考,我正在运行 Raspbian,它与 Debian 几乎相同。

答案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则不会被设置。如果通过 shell 调用它们,$PATH则可以根据 shell 及其配置方式进行设置,但通常仍然不会设置,这就是 init 脚本通常包含完整路径的原因。

诸如此类的环境变量$PATH通常在 shell 脚本中设置,这些变量可以在 shell 启动时自动获取;有关 bash 如何执行此操作的说明,请参阅 中的 INVOCATION man bash。对于以非交互方式调用的 shell sh(即大多数 init 脚本),不存在自动获取的文件。

环境变量也是继承的,但除非 init (系统上的第一个进程)设置一些环境变量,否则它的子进程(例如执行的 init 脚本)将不会继承任何内容。

如果特定的引导服务需要以某种方式设置环境,则该服务有责任为自己设置这样的环境。 传统上,这是通过在 init 脚本中初始化变量来完成的。

在后台运行(或发送到)的进程

进程从其父进程(启动它们的进程)继承其环境。将它们发送到后台并不会改变这一点。

相关内容