我试图理解为什么ps
它的行为不符合我的预期。从手册页中,以下命令应显示ppid
和lstart
,其中项目按lstart
顺序排序。但是,当我在三个不同的终端中运行相同的命令时:
第一学期:
gauthier@sobel:~/ $ ps -o ppid -o lstart --sort=lstart
PPID STARTED
21142 Tue Dec 16 13:45:18 2014
3383 Mon Dec 15 15:40:35 2014
第二期:
gauthier@sobel:~/bin $ ps -o ppid -o lstart --sort=lstart
PPID STARTED
19595 Tue Dec 16 13:45:03 2014
3383 Mon Dec 15 14:49:14 2014
第三学期:
gauthier@sobel:~ $ ps -o ppid -o lstart --sort=lstart
PPID STARTED
3383 Tue Dec 16 13:39:05 2014
16357 Tue Dec 16 13:45:12 2014
这里有几件事我不明白。
第 1 项和第 2 项中的项目按最新的排在最前面。第 3 项中的项目按最旧的顺序排列在最前面。即使考虑字母顺序,顺序也是不同的。
PPID 3383 对于所有三个术语都是相同的,但开始时间不同。看起来几个不同的PPID可能是相同的,尽管它们是不同的进程?
系统信息:
$ ps -V
procps-ng version 3.3.9
$ uname -a
Linux sobel 3.13.0-37-generic #64-Ubuntu SMP Mon Sep 22 21:28:38 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
答案1
ps --sort=lstart
实际上并不排序lstart
,根据此服务器故障评论:
lstart
给出完整的时间戳,但不能用作排序键。start_time gives
通常的“过去 24 小时内的时间,否则为日期”列,并且可以用作排序键。
ps
这在的手册页中隐式记录,其中lstart
未在OBSOLETE SORT KEYS
部分下列出,但start_time
已列出。
这源代码也支持这一点,请参阅从第 1506 行开始的定义:
/* Many of these are placeholders for unsupported options. */
static const format_struct format_array[] = {
/* code header print() sort() width need vendor flags */
[...]
{"lstart", "STARTED", pr_lstart, sr_nop, 24, 0, XXX, ET|RIGHT},
[...]
{"start_time", "START", pr_stime, sr_start_time, 5, 0, LNx, ET|RIGHT},
[...]
};
编辑:对正确答案的解释进行了扩展,并删除了原始答案的误导部分。
答案2
我在我的 gnu/gentoo 上尝试了一下,没有这样的问题,这里是:
~ # ps -o ppid -o lstart --sort=lstart
PPID STARTED
3851 Mon Dec 15 21:25:51 2014
4037 Mon Dec 15 21:25:52 2014
4042 Tue Dec 16 22:02:24 2014
~ # ps -o ppid -o lstart --sort=lstart
PPID STARTED
3851 Mon Dec 15 21:25:51 2014
4037 Mon Dec 15 21:25:52 2014
4042 Tue Dec 16 22:02:25 2014
~ # ps -o ppid -o lstart --sort=lstart
PPID STARTED
3851 Mon Dec 15 21:25:51 2014
4037 Mon Dec 15 21:25:52 2014
4042 Tue Dec 16 22:02:26 2014
~ # ps -V
procps-ng version 3.3.9
~ # uname -a
Linux 3.12.21-gentoo-r1 #9 SMP Fri Nov 28 18:59:44 CST 2014 i686 Intel(R) Core(TM)2 CPU T7200 @ 2.00GHz GenuineIntel GNU/Linux