首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于编辑这一行的配置文件是什么:主PID: 675992 (/usr/sbin/在调用systemctl状态apache2时看到)?

用于编辑这一行的配置文件是什么:主PID: 675992 (/usr/sbin/在调用systemctl状态apache2时看到)?
EN

Ask Ubuntu用户
提问于 2023-03-04 23:04:20
回答 1查看 107关注 0票数 2

无头服务器22.04.2当我调用systemctl status apache2时,我看到的似乎是一个错误,我得到了以下内容:

代码语言:javascript
复制
_________________________________________________________________
 systemctl status apache2
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-03-04 08:56:03 EST; 8h ago
       Docs: https://httpd.apache.org/docs/2.4/
   Main PID: 675992 (/usr/sbin/apach)
      Tasks: 56 (limit: 2283)
     Memory: 26.1M
        CPU: 8.882s
     CGroup: /system.slice/apache2.service
             ├─675992 /usr/sbin/apache2 -k start
             ├─675993 /usr/sbin/apache2 -k start
             ├─675994 /usr/sbin/apache2 -k start
             └─675995 /usr/sbin/apache2 -k start
____________________________________________________

主要PID: 675992 (/usr/sbin/apach)在我看来是错误的。不应该是apache或apache2吗?我可能会在设置错误时犯错误。如果是的话-我该怎么编辑?

EN

回答 1

Ask Ubuntu用户

回答已采纳

发布于 2023-03-05 17:40:55

tl;

博士

不,在设置apache2服务器时没有输入错误。进程名不是从配置文件中读取的,而是从/proc/[pid]/comm内核接口读取的,并且在那里进行截断。

它似乎是一个特定的apache2模块,mod_perl,它负责用(截断的)路径/usr/sbin/apach替换basename apache2

详细信息

systemctl status命令在/proc/[pid]/comm上从内核的进程信息伪文件系统读取进程名,其中进程ID [pid]是apache2 Main PID。您可以通过在systemctl status apache2下运行strace来验证这一点,例如:

代码语言:javascript
复制
$ systemctl show -P MainPID apache2.service
6525
$ strace -P /proc/6525/comm -e trace=%file,read,write systemctl --no-pager status apache2 >/dev/null
openat(AT_FDCWD, "/proc/6525/comm", O_RDONLY|O_CLOEXEC) = 4
newfstatat(4, "", {st_mode=S_IFREG|0644, st_size=0, ...}, AT_EMPTY_PATH) = 0
read(4, "/usr/sbin/apach\n", 1024)      = 16
read(4, "", 1024)                       = 0
+++ exited with 0 +++

您可以看到它正在读取字符串/usr/sbin/apach\n,总共有16个字符,包括终止的换行符\n。这个长度限制是由内核TASK_COMM_LEN参数施加的,如man proc中所指出的:

/proc//comm (因为Linux2.6.33)该文件公开进程的comm值-即与进程关联的命令名。同一进程中的不同线程可能具有不同的comm值,可通过/proc//task//comm访问。一个线程可以通过写入/proc/self/task/ comm文件来修改它的comm值,或者修改同一线程组中任何其他线程的comm值(参见CLONE_THREAD在克隆(2)中的讨论)。长度大于TASK_COMM_LEN (16)字符(包括终止空字节)的字符串将被静默截断。该文件提供了prctl(2) PR_SET_NAME和PR_GET_NAME操作的超集,当用于重命名调用方以外的线程时,pthread_setname_np(3)使用它。该文件中的值用于/proc/sys/ker/core_pattern中的%e说明符;参见core(5)。

如果您查看几乎任何其他进程,您将看到它的/proc/[pid]/comm文件只包含程序的basename。16字符的TASK_COMM_LEN值表明它不打算包含路径组件-实际上,如果您安装了一个基本的apache2服务器,这正是您所看到的。那么,是什么将其改为/usr/sbin/apach呢?

召集一些google-fu,它的答案是国防部_珀尔。具体来说,在这个关于红帽Bugzilla - Bug 782369的评论中

进程可以调用prctl(PR_SET_NAME)来设置内核中的任务名称(任务->comm),只要名称小于16个字符即可。如果在httpd中包含了mod_perl,则调用prctl并将名称设置为'/usr/sbin/httpd‘。为什么要这么做,我完全不知道。但确实如此。

("httpd“是RedHat所说的apache2)。如果在测试环境中运行apache2,则可以通过临时禁用mod_perl模块来验证这是罪魁祸首:

代码语言:javascript
复制
sudo a2dismod perl
sudo systemctl restart apache2

您应该会看到systemctl status输出中的进程名恢复为(apache2)。之后,您可以重新启用国防部。

代码语言:javascript
复制
sudo a2enmod perl

重新启动服务。

票数 2
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1457794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档