Как проверить, какие процессы все еще активны после выхода из сеанса пользователя

Мне нужно выполнить некоторую отладочную работу, и как часть этой отладочной работы мне нужно знать, есть ли еще процессы, запущенные после выхода из сеанса пользователя. И мне нужно конкретно уметь также сказать, к какому пользователю принадлежат эти процессы. Для меня также было бы полезно иметь возможность регистрировать процессы, которые все еще активны, во время как можно большей части процесса выключения.

Например, я уже пытался регистрировать, какие процессы все еще активны после выхода из сеанса определенного пользователя, имея активную учетную запись администратора в то же время, что и другая учетная запись, так что, пока другая учетная запись выходит из системы, учетная запись администратора будет регистрировать процесс деятельности с:

top > ~/top.txt

Но с этим возникли две проблемы: во-первых, это не позволило бы мне рассказать что-либо о процессах, которые активны во время процесса выключения (а также о том, что я мог записать до завершения процесса регистрации), и, во-вторых, вывод в текстовый файл было нечитаемым для меня, потому что большинство строк выглядели примерно так:

топ странный вывод

И хотя я могу выделить это и посмотреть на фактический пример top работая в моем CLI, я могу сказать, что это за биты, но действительно трудно сказать, что я должен сделать, плюс я не знаю, в какой момент это произошло, я не знаю, был ли один из выходов в файл находится перед выходом из системы, или после, или каким-то моментом во время, и его действительно очень трудно прочитать.

Поэтому мне интересно, есть ли способ лучше достичь того, чего я пытаюсь достичь? И если кто-нибудь может дать мне какие-либо предложения о том, как я мог бы улучшить свои методы, или предложить какие-то новые методы.

Я думал о том, чтобы, возможно, запустить скрипт регистрации в качестве пользователя root автоматически, но, поскольку он представляет собой небольшую угрозу безопасности, он, вероятно, даст мне такой же зашифрованный вывод, как и из top до. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.


Информация об ОС:

Description:    Ubuntu 14.10
Release:    14.10

5 ответов

Решение

Вы на правильном пути: у меня также будет один пользователь, наблюдающий за другим. Если top не дает вывод, который вы хотите, я бы использовал ps aux в бесконечном цикле с задержкой в ​​1 секунду.

#!/bin/bash
# Example script for watching a logging off user
# This script is an answer to http://Ask-ubuntu.ru/questions/608921/how-to-check-which-processes-are-still-active-after-a-user-session-has-logged-ou/608925#608925

# Copyright (c) 2015 Fabby

# This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. See the GNU General Public License for more details.
# You DID NOT receive a copy of the GNU General Public License along with this program as the license is bigger then this program.

while true
do
  date   >> /tmp/watch-logoff.txt
  ps aux >> /tmp/watch-logoff.txt
  sleep 1
done

Вы придете к выводу, что процессы, принадлежащие вышедшему из системы пользователю, больше не работают после того, как они полностью вышли из системы.

Этот ответ Раду дает вам полный обзор того, как выполнить определенный скрипт при выходе из системы или завершении работы.

Что вы можете сделать, это создать скрипт, как это

#!/bin/bash
ps -u username > /home/yourusername/outputfile.txt

затем sudo chmod +x scriptname и добавить строку

session-cleanup-script=/path/to/script в /etc/lightdm/lightdm.conf

Что касается выключения.,, Я полагаю, что во время отключения работает /etc/rc6.d/S20sendsigs который посылает сигналы уничтожения всем работам, так что вы можете запустить этот скрипт с именем файла S10_scriptname, чтобы запустить его перед тем, как отправлять скрипт (обратитесь к ответу Раду для получения дополнительной информации)

Изменить: по состоянию на 14.04, lightdm.conf не создается по умолчанию, поэтому вам может потребоваться создать этот файл в /etc/lightdm/lightdm.conf.d/ каталог с первой строкой [Seat Defaults]

You can run htop from one of the tty consoles so that you can log a user out of an xsession but still maintain an open terminal (htop is better than top and easier to read).

CTRL + ALT + F2 You can login a text session under a different username from there and then, use:

sudo htop

чтобы начать это. Используйте F6, а затем прокрутите вверх до USER с помощью кнопки со стрелкой и нажмите Enter. Это отфильтрует результаты по пользователю, чтобы их было легче читать для этих целей.

Чтобы вернуться к сеансу, нажмите CTRL + ALT + F7 и CTRL + ALT + F2, чтобы снова вернуться к tty2 и так далее.

Используйте следующее, чтобы перечислить все процессы любого конкретного пользователя:

$ ps -fu "username"

Например:

$ ps -fu foobar

Чтобы сохранить его в файле:

$ ps -fu foobar > ~/ps_foobar

Вот один лайнер, который можно использовать через cron или любой другой механизм повторения:

[[ $(ps -u foobar | wc -l) -gt 1 ]] && echo "user foobar has process running" || echo "user foobar has no process running"

Чтобы проверить журналы во время выключения (столько, сколько может быть зарегистрировано):

tail -f /var/log/syslog  ## Run it prior to shutdown

Или просто прочитайте файл /var/log/syslog в любое время, он содержит полную информацию, поэтому будет легко понять.

Вы можете использовать ~./ Bash_logout, если он используется для выхода пользователя из системы (примечание, оболочка bash, например, ssh). Но некоторые другие ситуации также описаны в статье / ответе ниже,

superuser.com: создание-выхода-сценария-задачи-для-linux

@heemayl и другие уже описывают некоторые команды, которые вы можете использовать, чтобы получить все еще работающие процессы, когда пользователи выходят из системы.

Если вам нужны только текущие PID пользователя, вы также можете использовать ниже,

$ id -u username | xargs pgrep -U
Другие вопросы по тегам