有什么办法可以查出我刚刚杀了什么吗?
$ ps -A -o pid,cmd | grep someApp | grep -v grep
2802 python someApp.py
$ sudo kill 2302
$
编辑:为了澄清,我需要在杀死 PID 2302 之前知道它是什么。这ps
句话是为了说明我是如何杀死 2302 的,当时我什至不知道它是什么。
答案1
没有通用的方法可以知道,但您可能有线索。
您发送了 TERM 信号,而不是 KILL 信号,因此程序有机会运行信号处理程序。它可能根本没有死,或者它可能在某处留下了日志条目。检查进程是否仍在运行 ( ps 2302
),如果没有,请检查系统日志。
如果有的话,会有所有进程的日志流程会计已启用。这可以在 Linux 上通过GNU帐户,但对于大多数发行版来说,默认情况下不会安装该软件包。如果启用了进程记帐,请运行lastcomm
(您可能需要 root 权限)才能查看最近终止的进程(最新的在前)。使用 时lastcomm
,仅跟踪命令名称,而不跟踪 PID 或参数;您必须通过环境匹配来找出它是哪个过程。在 Linux 下,lastcomm
显示进程退出的日期,但粒度仅为 1 分钟,X
如果命令被信号杀死,则命令名称后面有一个标志。
GNU acct 跟踪更多信息,包括进程 ID,但该lastcomm
命令不显示它:您必须运行dump-acct
,不幸的是,它并没有表明命令是否被信号杀死。
dump-acct /var/log/account/pacct | awk -F '|' '$10 ~ / *2302($| )/'
还有其他子系统可以记录进程,例如 Linux 的审计,但它们通常没有配置为这样做。
答案2
除非您使用某些东西来记录系统上生成的每个进程(例如审计或进程记帐),否则没有确定的方法。
现在,您可能想尝试的事情:
- 该进程可能正在记录事物(通过 syslog 或其他),包括其 pid,因此您可以执行
zgrep -w 2302 /var/log/**/*(.m-1)
(zsh 语法)来尝试识别它。 - 它或其父进程可能已经记录了一些内容来报告该进程的死亡,您可以查看自杀死以来已修改的文件,看看它们是否包含任何线索(查看每个
.xsession-errors
以图形方式登录的用户的 /再次 var/log,查看lsof -nP
输出以查看是否有一些条目看起来像当前打开的日志文件...)... - 如果该机器上没有生成太多进程,请查看接近 2302 的 pid 及其启动时间。 2302 可能是它们的父级或子级,或者是相关命令,它可能会指示哪个用户可能生成它......
- 如果它是在某些用户的终端中生成的,您可以查看任何终端设备的任何修改时间是否与
/dev
终止时间匹配,这可以帮助您再次缩小搜索范围...
答案3
不,没有。不是之后,就是这样。
但是,如果您在kill命令之前执行“ps -A > list”,您将拥有一个名为list的文件,其中包含在终止该进程之前运行的所有进程的列表。