哪个配置文件适用于编辑此行:主 PID:675992(调用 systemctl status apache2 时看到 /usr/sbin/)?

哪个配置文件适用于编辑此行:主 PID:675992(调用 systemctl status apache2 时看到 /usr/sbin/)?

无头服务器 22.04.2 我调用时似乎出现了拼写错误,systemctl status apache2我得到了这个:

_________________________________________________________________
 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) 对我来说似乎有误。apach 不应该是 apache 或 apache2 吗?我在设置时可能打错了。如果是这样 - 我该如何编辑它?

答案1

总结

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

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

细节

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

$ 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/[pid]/comm (since Linux 2.6.33)
      This  file exposes the process's comm value—that is, the command
      name associated with the process.  Different threads in the same
      process   may   have   different  comm  values,  accessible  via
      /proc/[pid]/task/[tid]/comm.   A  thread  may  modify  its  comm
      value,  or  that of any of other thread in the same thread group
      (see the discussion of CLONE_THREAD in clone(2)), by writing  to
      the   file   /proc/self/task/[tid]/comm.   Strings  longer  than
      TASK_COMM_LEN (16) characters (including  the  terminating  null
      byte) are silently truncated.
      This  file  provides  a superset of the prctl(2) PR_SET_NAME and
      PR_GET_NAME operations, and is employed by pthread_setname_np(3)
      when used to rename threads other than the caller.  The value in
      this file  is  used  for  the  %e  specifier  in  /proc/sys/ker‐
      nel/core_pattern; see core(5).

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

用谷歌搜索一下,答案是mod_perl。具体来说,在这篇评论中Red Hat Bugzilla – 错误 782369

进程可以调用 prctl(PR_SET_NAME) 在内核中设置其任务名称 (task->comm),只要名称不超过 16 个字符。如果 httpd 中包含 mod_perl,它会调用 prctl 并将名称设置为 '/usr/sbin/httpd'。

我完全不知道它为什么会这样。但它确实会这样。

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

sudo a2dismod perl
sudo systemctl restart apache2

您应该会看到输出中的进程名称systemctl status恢复为(apache2)。之后您可以使用以下命令重新启用该模块

sudo a2enmod perl

并重新启动该服务。

相关内容