- 启动脚本(启动时)
- 在后台运行(或发送到)的进程(例如使用 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 脚本中初始化变量来完成的。
在后台运行(或发送到)的进程
进程从其父进程(启动它们的进程)继承其环境。将它们发送到后台并不会改变这一点。