如何在Ubuntu上检查一个我不知道名称的服务是否正在运行

279

我不知道这个服务的名称,但希望通过检查它的状态来停止该服务。

例如,如果我想检查PostgreSQL服务是否正在运行,但我不知道服务名称,那么如何检查其状态呢?

我知道如果知道服务名称,则可以使用命令来检查其状态。


1
那么,如果你不知道服务名称,怎么知道它是正确的服务呢?我可以在 /etc/init.d/ 中添加很多包含 postgres 关键字的初始化脚本(尽管这样做毫无意义!),那你怎样知道要停止的就是你想要停止的服务呢?请给您的上下文添加一些解释。 - Stefan
1
@Stefan,由于我对Linux命令不熟悉,我想知道如果我不知道正确的服务名称,但部分使用了服务名称的一部分或类似名称,我能否找到相同的服务。 - abcd
1
您可以使用服务列表或ps -ef并解析输出。无论如何,我认为停止您认为应该停止但不确定的服务不是一个好主意。因此,您应该列出在您想要停止的机器上运行的真实服务名称清单。如果您考虑仅停止“标准”服务,例如postgres,mysql,http,则可以非常轻松地找到服务名称。 - Stefan
请查看askubuntu组:http://askubuntu.com/questions/407075/how-to-read-service-status-all-results - svassr
14个回答

475

我没有Ubuntu系统,但在Red Hat Linux上,您可以通过运行以下命令查看所有正在运行的服务:

service --status-all
在列表中,+ 表示服务正在运行,- 表示服务未运行,? 表示无法确定服务状态。

3
谢谢。文档没有说明每个服务旁边的符号代表什么。我猜“+”表示正在运行,“-”表示未运行......然后还有许多服务旁边有“?”。"+"表示正在运行吗? - Oscar
95
"+" 开始 "-" 停止 "?" 未知 - gkiko
@PolarisUser 可以使用 chkconfig --listservice --status-all 命令。 - fduff
16
为什么一个服务被标记为 [-] {name},但 sudo service {name} status 显示其正在运行? - Mark Murphy
6
如@linuxnewbee在此处提到的那样,您可能也希望运行sudo initctl list - svassr
显示剩余3条评论

93

对于Ubuntu(已验证为12.04),您可以使用“grep”获取所有服务的列表,并选择其中一个颜色:

sudo service --status-all | grep postgres

或者如果您知道服务的正确名称,您可以使用另一种方式:

sudo service postgresql status

4
我没有看到grep有任何作用(也在使用Ubuntu 12.04)。 - notapatch
2
正确的grep方式是:sudo service --status-all 2>&1 | grep postgres - Adam Chwedyk
在运行服务的Ubuntu 15.04(Vivid)中,“sudo service x status”报告“Active:inactive(dead)”。 - Dinei

44

也许你想要的是 ps 命令。

ps -ef

将会显示所有正在运行的进程。如果您知道您要查找什么,请使用grep进行筛选;

ps -ef | grep postgres

4
有时进程名称与服务名称不同。 - Francisco Quintero
可能更好的是pgrep -a postgres。这也避免了那些烦人的grep --color=auto needle - Pablo Bianchi

27

有一种简单的方法来验证一个服务是否在运行。

systemctl status service_name

试用PostgreSQL:

systemctl status postgresql

24
如果您运行以下命令,您将获得服务列表:
sudo service --status-all

要获取upstart作业列表,请运行此命令:

sudo initctl list

1
@Ajay 这是因为 Ubuntu 在 16.10 版本中从 upstart 切换到了 systemd。要获取完整列表,我会使用 systemctl --full --type service --all - Pablo Bianchi

6
您可以使用以下命令来检查所有服务的列表。
ps aux 

检查自己的服务:

要检查您自己的服务:

ps aux | grep postgres

这与上面的答案完全相同。 - Pablo Bianchi

2

运行

ps -ef | grep 与进程相关的名称

以上命令将提供有关进程的所有详细信息,如pid、启动时间等。

例如,如果您想要所有与Java相关的进程,请输入Java,或者如果您知道进程的名称,请输入名称。


这个方法只适用于服务名称长度不超过8个字符的情况。否则,列表会被截断。 - Tomas Kubes

2

最好的方法是使用终端中的 nmap 工具。

nmap 是一个有用的工具,可以通过使用其 IP 地址 分析上线系统,然后显示所有活动的网络 服务

打开 终端 并使用以下示例:

~$ nmap 192.168.1.3/24

Starting Nmap 5.21 ( http://nmap.org ) at 2016-05-16 22:49 IRDT
Nmap scan report for 192.168.1.3
Host is up (0.00020s latency).
Not shown: 994 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
23/tcp   open  telnet
139/tcp  open  netbios-ssn
445/tcp  open  microsoft-ds
3389/tcp open  ms-term-serv
3689/tcp open  rendezvous

2
这仅适用于网络服务,显然。 - Molomby

1

在Linux操作系统上检查服务的状态:

//in case of super user(admin) requires    
sudo service {service_name} status 
// in case of normal user
service {service_name} status 

停止或启动服务

// in case of admin requires
sudo service {service_name} start/stop
// in case of normal user
service {service_name} start/stop 

获取所有服务及其PID列表:

sudo service --status-all

你可以使用systemctl而不是直接调用service:

systemctl status/start/stop {service_name}

0

查找正在运行的服务的不良方法。(有时不准确,因为某些自定义脚本没有 |status| 选项)

[root@server ~]# for qw in `ls /etc/init.d/*`; do  $qw status | grep -i running; done
auditd (pid  1089) is running...
crond (pid  1296) is running...
fail2ban-server (pid  1309) is running...
httpd (pid  7895) is running...
messagebus (pid  1145) is running...
mysqld (pid  1994) is running...
master (pid  1272) is running...
radiusd (pid  1712) is running...
redis-server (pid  1133) is running...
rsyslogd (pid  1109) is running...
openssh-daemon (pid  7040) is running...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接