Unix 会计:没有磁盘可执行文件的 lastcomm 命令 - 它们是什么?

Unix 会计:没有磁盘可执行文件的 lastcomm 命令 - 它们是什么?

与安全相关的练习: 为了提高安全性,我acct启用了传统的 Unix 记账 ( )。这有助于事后调查可疑活动。

根据手册页,/var/log/account有一个目录包含pacct(进程记帐)文件,其中包含内核写入的进程记帐数据,大概是针对exit记帐处于活动状态时编辑的每个进程。命令名称被截断为 15 个字符(这似乎是一个小错误:man 5 acct显示#define ACCT_COMM 16不包括结构中终止 NULL 的附加字符,但我看到最大值为 15 个字符而不是 16 个)。

当我运行lastcomm将最新pacct文件转换为人类可读格式的命令时,即使我忽略了超过 15 个字符限制的字符,我也会得到一些行,其中第一列(最左边)不是明显的命令(磁盘上可执行文件的名称)。以下是一些示例:

kworker/dying
handle-watcher-
WorkerPool/28
ScriptStreamerT
Compositor
CompositorTileW
Chrome_ChildIOT

其中一些看起来像是内核线程的名称。我可以看到还有许多正在运行的线程(例如在 中),但这些线程未出现在此列表中。我假设缺失的线程是自启用以来top从未运行过的长时间运行的进程。exitacct

问题: 有人能解释一下上述每个未说明的进程是什么吗?

作为参考,这里是列出磁盘上未找到的命令的 bash 脚本,因此您可以自己运行它(确保sudo updatedb先运行)

#!/bin/bash

fullpath_of_cmd() {
    # cmd may be truncated to a max of 15 chars (see "man 5 acct")
    cmd="$1"
    # Search for any file matching this prefix
    # (assumes locate db is up to date)
    paths=$(locate "/$cmd")
    echo "$paths"
}

for cmd in $(lastcomm | cut -d' ' -f1 | sort -u); do
    # echo === $cmd
    paths=$(fullpath_of_cmd "$cmd")
    case "$paths" in
        (*/$cmd*) : cool, found it ;;
        (*) printf "%s -> NOT FOUND (%s)\n" $cmd $paths ;;
    esac
done

答案1

comm字段不一定与可执行文件名称相对应;它可以由程序本身自由设置,通过在/proc/self/commLinux 上写入或使用一些神秘的 prctl()。

然而,在 Linux 上,记账日志似乎不仅包括进程,还包括用户空间线程。(毕竟,Linux 进程和线程几乎相同。)给出的示例看起来与 Chromium 或其他基于 WebKit/Blink 的浏览器使用的线程名称完全一样。

要亲自查看它们,请运行htop,按 F2,在“显示选项”下启用以下内容:

  • [✔] 显示自定义线程名称
  • [✔] 以不同颜色显示线程

按下Shift+H可切换用户空间线程;Shift+K按下可切换内核线程。

相关内容