如果我运行命令 ps 或 top,它们是否只列出进程,还是同时列出服务和进程?如何判断给定行代表的是进程还是服务?
答案1
首先,术语服务在 Linux 环境中很少使用。更常见的是术语守护进程。
虽然这两个术语描述的是同一类型的应用,但术语服务通过在 Windows 环境中使用该术语,确实具有一些附加属性。
守护进程与普通的进程的定义很简单,守护进程是一个后台进程,不与用户交互。但最重要的是,守护进程只是一个术语。据我所知,Linux 中没有标志告诉它“此进程是一个守护进程“。
ps
因此守护进程并没有什么特别之处。我们只是将某种类型的程序称为守护进程。这也是为什么或没有任何区别top
。
但是如果你想知道当前正在运行的哪个进程最有可能是我们想到的守护进程,请尝试ps axjf
:
oliver@ubuntuServer:~$ ps axjf
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
0 2 0 0 ? -1 S 0 0:00 [kthreadd]
2 3 0 0 ? -1 S 0 0:01 \_ [ksoftirqd/0]
2 5 0 0 ? -1 S 0 0:00 \_ [kworker/u:0]
2 6 0 0 ? -1 S 0 0:00 \_ [migration/0]
2 7 0 0 ? -1 S 0 0:00 \_ [migration/1]
2 9 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/1]
2 10 0 0 ? -1 S 0 0:09 \_ [kworker/0:1]
2 11 0 0 ? -1 S 0 0:00 \_ [migration/2]
2 12 0 0 ? -1 S 0 0:00 \_ [kworker/2:0]
2 13 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/2]
2 14 0 0 ? -1 S 0 0:00 \_ [migration/3]
2 15 0 0 ? -1 S 0 0:00 \_ [kworker/3:0]
2 16 0 0 ? -1 S 0 0:00 \_ [ksoftirqd/3]
2 17 0 0 ? -1 S< 0 0:00 \_ [cpuset]
2 18 0 0 ? -1 S< 0 0:00 \_ [khelper]
2 19 0 0 ? -1 S< 0 0:00 \_ [netns]
2 20 0 0 ? -1 S 0 0:00 \_ [kworker/u:1]
2 21 0 0 ? -1 S 0 0:00 \_ [sync_supers]
2 22 0 0 ? -1 S 0 0:00 \_ [bdi-default]
2 23 0 0 ? -1 S< 0 0:00 \_ [kintegrityd]
2 24 0 0 ? -1 S< 0 0:00 \_ [kblockd]
2 25 0 0 ? -1 S< 0 0:00 \_ [ata_sff]
2 26 0 0 ? -1 S 0 0:00 \_ [khubd]
2 27 0 0 ? -1 S< 0 0:00 \_ [md]
2 28 0 0 ? -1 S 0 0:00 \_ [khungtaskd]
2 29 0 0 ? -1 S 0 0:00 \_ [kworker/3:1]
2 30 0 0 ? -1 S 0 0:03 \_ [kswapd0]
2 31 0 0 ? -1 SN 0 0:00 \_ [ksmd]
2 32 0 0 ? -1 SN 0 0:00 \_ [khugepaged]
2 33 0 0 ? -1 S 0 0:00 \_ [fsnotify_mark]
2 34 0 0 ? -1 S 0 0:00 \_ [ecryptfs-kthrea]
2 35 0 0 ? -1 S< 0 0:00 \_ [crypto]
2 43 0 0 ? -1 S< 0 0:00 \_ [kthrotld]
2 44 0 0 ? -1 S 0 0:00 \_ [scsi_eh_0]
2 45 0 0 ? -1 S 0 0:00 \_ [scsi_eh_1]
2 67 0 0 ? -1 S 0 0:00 \_ [kworker/1:1]
2 68 0 0 ? -1 S 0 0:09 \_ [kworker/0:2]
2 110 0 0 ? -1 S 0 0:00 \_ [kworker/1:2]
2 190 0 0 ? -1 S 0 0:00 \_ [scsi_eh_2]
2 208 0 0 ? -1 S 0 0:00 \_ [kworker/2:1]
2 218 0 0 ? -1 S< 0 0:00 \_ [kdmflush]
2 235 0 0 ? -1 S< 0 0:00 \_ [kdmflush]
2 243 0 0 ? -1 S 0 0:13 \_ [jbd2/dm-0-8]
2 244 0 0 ? -1 S< 0 0:00 \_ [ext4-dio-unwrit]
2 508 0 0 ? -1 S< 0 0:00 \_ [kpsmoused]
2 20477 0 0 ? -1 S 0 0:00 \_ [flush-252:0]
0 1 1 1 ? -1 Ss 0 0:00 /sbin/init
1 303 302 302 ? -1 S 0 0:00 upstart-udev-bridge --daemon
1 306 306 306 ? -1 Ss 0 0:00 udevd --daemon
306 438 306 306 ? -1 S 0 0:00 \_ udevd --daemon
306 445 306 306 ? -1 S 0 0:00 \_ udevd --daemon
1 562 541 541 ? -1 Sl 101 0:04 rsyslogd -c5
1 600 599 599 ? -1 S 0 0:00 upstart-socket-bridge --daemon
1 612 612 612 ? -1 Ss 102 0:00 dbus-daemon --system --fork --activation=upstart
这是相对较新的 Ubuntu 服务器安装的输出的一部分。输出应该是分层的,这样可以更轻松地识别系统进程。
就像同一ps
输出的这一部分一样。您可以清楚地看到,该链以sshd
(SSH 守护进程)开始,我登录到该守护进程并为自己创建了一个用户会话。在其中,bash
已启动,在 bash 中我有一个后台vi
进程,我ps
刚刚执行了。
8053 20352 20352 20352 ? -1 Ss 0 0:00 \_ sshd: oliver [priv]
20352 20378 20352 20352 ? -1 S 1000 0:00 \_ sshd: oliver@pts/0
20378 20379 20379 20379 pts/0 20570 Ss 1000 0:00 \_ -bash
20379 20569 20569 20379 pts/0 20570 T 1000 0:00 \_ vi
20379 20570 20570 20379 pts/0 20570 R+ 1000 0:00 \_ ps axjf
因此,查看这两部分ps
输出,您应该能够清楚地区分守护进程和用户进程。
答案2
服务是进程,所以是的,两者都被 ps 列出。它们只是没有明确区分。服务是侦听请求或连接的进程。
您可以使用 netstat 列出正在监听的进程(因此这些进程是服务的一部分)