在GNU / Linux上发布的最后一个命令

有人问我当地LUG的邮件列表是否有任何学习在GNU / Linux系统上发布的最后命令的方法。

我想我们正在全系统的讨论最后的命令。 经过一段时间的推理,如果您将一组命令限制为使用交互式控制台的实际用户发出的命令,那么最后一个命令应该已经在命令历史logging中注册。

另一种思考这个问题的方法是询问如何判断在GNU / Linux上创build的最后一个处理是关于它是否仍在运行或者是否已经完成,哪些是父进程和其他相关信息。

我已经为Linux提供了一个软件包,可以帮助处理会计。

在我的Ubuntu 9.10系统上,我做了这个安装程序“acct”:

sudo apt-get install acct 

然后需要创build一个空白的日志文件,你可以这样做:

 sudo touch /var/log/pacct 

之后,进程记帐需要被激活:

 sudo /usr/sbin/accton /var/log/pacct 

从这一点开始,进程与执行它们的用户以及相关的terminal一起logging下来。

该命令可以看到日志文件:

 lastcomm -f /var/log/pacct 

我仍然在看这个程序…但看起来像这有助于。

对于特定的用户(和shell):历史

对于当前进程:ps

那么系统宽泛,看起来相当复杂。 这样的系统意味着应该有一些过程来监视每个用户.bash_history。 然后,当更新中央数据库更新。 一旦完成,我们可以对从中央数据库中select的“历史”命令进行扩展。 不过不是一个坏主意。

如果您将以下内容添加到/ etc / sudoers文件中:

 Defaults logfile=/var/log/sudolog 

所有的sudo命令都会被logging下来。 这可能不是每个用户的命令,但是这应该列出可以修改系统的重要的命令,我猜测这就是你所追求的。

您不能简单地监视.bash_history,因为其他用户可能不会使用历史logging,也可能不会使用bash开始。

您可以使用监听来监视所有执行的命令。

如果你想要最新的正在运行的程序,那么使用/ proc中的信息,就像这样…

 for i in $(ls -t /proc/* | egrep "[0-9]+"); do test -f $i/cmdline && cat $i/cmdline && break; done 

它将在/ proc中查找基于数字的目录(pid),然后检查cmdline文件是否存在并将其打印出来(显然,只要进入循环,pipe道中的命令就会消失,因此它们的cmdline文件将不存在)