Учет Unix: команды lastcomm без исполняемых файлов на диске - что это?

0

Упражнение, связанное с безопасностью: для дополнительной безопасности у меня acctвключен традиционный учет Unix ( ). Это может помочь расследовать подозрительную деятельность после факта.

Согласно man-странице /var/log/account- это каталог, содержащий pacct(учет процессов) файлы, которые содержат данные учета процессов, записанные ядром, предположительно для каждого процесса, который exitредактировался, когда учет был активным. Имена команд усекаются до 15 символов (это, кажется, небольшая ошибка: man 5 acctпоказано, что в структуре #define ACCT_COMM 16не указан дополнительный символ для завершающего NULL, но я вижу максимум 15 символов вместо 16).

Когда я запускаю программу, lastcommкоторая преобразует самый последний pacctфайл в читабельную форму, я получаю строки, где 1-й (крайний левый) столбец не является очевидной командой (имя исполняемого файла на диске), даже если я игнорирую символы после 15- предел символа. Вот некоторые примеры:

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

Некоторые из них выглядят как имена потоков ядра. Я вижу еще много потоков (например, в top), которые не отображаются в этом списке. Я предполагаю, что отсутствующие являются долго выполняющимися процессами, которые никогда не exitредактировались, поскольку acctбыли включены

Вопрос: Может ли кто-нибудь объяснить, что представляет собой каждый из перечисленных выше неучтенных процессов?

Для справки, вот скрипт 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
arielf
источник

Ответы:

1

commПоле не обязательно соответствует имени исполняемого файла; он может быть свободно установлен самой программой, записывая в /proc/self/commLinux или используя некоторые тайные prctl ().

Однако в Linux журнал учета, похоже, включает не только процессы, но и потоки в пользовательском пространстве. (Процессы и потоки в Linux, в конце концов, почти одинаковы.) Приведенные примеры выглядят точно так же, как имена потоков, которые будут использовать Chromium или какой-либо другой браузер на основе WebKit / Blink.

Чтобы увидеть их самостоятельно, запустите htopклавишу F2, в разделе «Параметры отображения» включите следующее:

  • [✔] Показать пользовательские имена потоков
  • [✔] Показать темы в другом цвете

Нажмите, Shift+Hчтобы переключать темы пользовательского пространства; Shift+Kдля потоков ядра.

grawity
источник