如何检查用户会话注销后哪些进程仍处于活动状态

如何检查用户会话注销后哪些进程仍处于活动状态

我需要做一些调试工作,作为调试工作的一部分,我需要知道在用户会话注销后是否还有任何进程在运行。我还需要具体地知道这些进程属于哪个用户。在关机过程中尽可能多地记录仍处于活动状态的进程也很有用。

例如,我已经尝试过通过让管理员帐户与另一个帐户同时处于活动状态来记录在某个用户会话注销后哪些进程仍处于活动状态,这样,当另一个帐户注销时,管理员帐户将使用以下命令记录进程活动:

top > ~/top.txt

但是这样做有两个问题,首先,它不允许我告知有关关机过程中活动进程的任何信息(以及在日志记录过程终止之前我可以记录的大部分信息),其次,文本文件的输出对我来说是不可读的,因为大多数行看起来像这样:

最奇怪的输出

尽管我可以将其分开,并通过查看top在我的 CLI 中运行的实际示例,我可以分辨出一些位是什么,但很难分辨我必须做什么,而且我不知道在哪个点发生了什么,我不知道文件中的某个输出是在注销之前,之后,还是在注销期间的某个时间点,而且真的很难阅读。

所以我想知道是否有办法更好地实现我想要实现的目标?如果有人能给我一些建议,告诉我如何改进我的方法,或者建议一些新的方法。

我考虑过以 root 身份自动运行日志脚本,但这样做不仅存在一些安全风险,还可能会给我带来与之前相同的混乱输出top。如果您需要更多信息,请告诉我。


操作系统信息:

Description:    Ubuntu 14.10
Release:    14.10

答案1

你说的对:我也会让一个用户监视另一个用户。如果top没有得到你想要的输出,我会使用ps aux一个无限循环,延迟 1 秒。

#!/bin/bash
# Example script for watching a logging off user
# This script is an answer to http://askubuntu.com/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

你会得出这样的结论已注销用户的进程在用户完全注销后仍会继续运行。

答案2

Radu 的回答为您提供有关如何在注销或关机时执行特定脚本的完整概述。

您可以做的是创建这样的脚本

#!/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 的脚本以在发送信号脚本之前启动它(有关更多信息,请参阅 Radu 的回答)

编辑:从 14.04 开始,lightdm.conf 不会默认创建,因此您可能需要在/etc/lightdm/lightdm.conf.d/目录中创建此文件,第一行内容为[Seat Defaults]

答案3

使用以下命令列出任何特定用户的所有进程:

$ 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,它包含完整的时间信息,因此很容易理解。

答案4

如果是用于用户注销时,则可以使用 ~./bash_logout(注意,bash shell,例如 ssh)。但下面的文章/答案中还描述了一些其他情况,

superuser.com: 为 Linux 创建注销脚本任务

@heemayl 和其他人已经描述了一些可用于在用户注销时获取仍在运行的进程的命令。

如果你只想要用户的运行 PID,你也可以使用下面的方法,

$ id -u username | xargs pgrep -U

相关内容