2014-12-15 02:59:25 +0000 2014-12-15 02:59:25 +0000
17
17

如何判断Raspberry Pi上哪些服务在启动时运行?(raspbian)

我有一些服务是在启动时运行的,但我实际上已经忘记了如何设置它们!如果我想改变它们的活动,我该如何做?如果我想改变它们的活动,我该怎么做呢?例如,也许我想禁止一个服务在启动时启动,或者我想用不同的方法启动它。

具体来说,我的openvpn服务在启动时成功运行,但有些教程说我应该将文件共享程序的服务与vpn本身绑定,这样如果vpn宕机,那么文件共享服务也会宕机。但我觉得可能是我的vpn的自动运行把事情搞复杂了,我应该禁用它或者修改它的启动方式。但是怎么检查呢?

答案 (3)

23
23
23
2014-12-16 14:49:09 +0000

我假设你的树莓使用的是raspian,据我所知,raspian还没有发展到systemd。在这种情况下,答案如下。

编辑:对于systemd(Jessie或更高版本),见底部

首先,你可以通过命令来确定当前运行的是哪个系统。

sudo service --status-all

你会得到一个类似这样的列表:

[+] triggerhappy
  [+] udev
  [?] udev-mtab
  [?] umountfs
  [?] umountnfs.sh
  [?] umountroot
  [-] urandom
  [+] vsftpd
  [+] weewx
  [-] x11-common

+的表示正在运行的服务,-的表示没有运行的服务,? 的表示不允许将status_作为可能的命令的服务:它们大多是不需要一直运行的命令,只是偶尔运行。

回到你的问题,你需要了解Linux中的runlevels。运行级别(0-6 + S)标识了哪些服务可以/必须运行。一个启动序列从初始运行级别(在/etc/inittab中指定,在我的Raspberry中是

# The default runlevel.
 id:2:initdefault:

这一行将其标识为2,然后前进到发行版标准的最终运行级别(从2到5)。你可以通过命令

# runlevel
 N 2

来识别你当前的运行级别(在我的例子中,是无头服务器)。其他的运行级别是(同样来自 é/etc/inittab/*):

# Runlevel 0 is halt.
 # Runlevel 1 is single-user.
 # Runlevels 2-5 are multi-user.
 # Runlevel 6 is reboot.

单一用户(1)通常也被识别为 S.

在一个正常的启动中,你从 2 开始,一直到 5。要找到在这个过程中启动的服务,请发出命令。

# grep -nrI Default-Start /etc/init.d
 umountroot:7:# Default-Start:
 checkroot.sh:8:# Default-Start: S
 kbd:6:# Default-Start: S
 isc-dhcp-server:11:# Default-Start: 2 3 4 5
 mountkernfs.sh:7:# Default-Start: S
 hostname.sh:7:# Default-Start: S
 mountnfs.sh:7:# Default-Start: S
 halt:6:# Default-Start:
 dphys-swapfile:20:# Default-Start: 2 3 4 5
 bootlogs:7:# Default-Start: 1 2 3 4 5
 rc.local:6:# Default-Start: 2 3 4 5
 hostapd:9:# Default-Start: 2 3 4 5
 keyboard-setup:8:# Default-Start: S
 lightdm:7:# Default-Start: 2 3 4 5
 procps:11:# Default-Start: S
 mysql:9:# Default-Start: 2 3 4 5
 single:6:# Default-Start: 1
 vsftpd:7:# Default-Start: 2 3 4 5
 samba:7:# Default-Start: 2 3 4 5
 mountall.sh:6:# Default-Start: S
 weewx:20:# Default-Start: 2 3 4 5
 umountnfs.sh:7:# Default-Start:
 triggerhappy:6:# Default-Start: 2 3 4 5
 ifplugd:24:# Default-Start: 2 3 4 5
 alsa-utils:9:# Default-Start: S
 bootmisc.sh:7:# Default-Start: S
 sendsigs:6:# Default-Start:
 console-setup:7:# Default-Start: S
 nfs-common:7:# Default-Start: 2 3 4 5 S
 checkroot-bootclean.sh:6:# Default-Start: S
 rsyslog:7:# Default-Start: 2 3 4 5
 x11-common:7:# Default-Start: S
 mountdevsubfs.sh:7:# Default-Start: S
 cron:10:# Default-Start: 2 3 4 5
 mountnfs-bootclean.sh:6:# Default-Start: S
 mountall-bootclean.sh:6:# Default-Start: S
 screen-cleanup:11:# Default-Start: S
 udev:6:# Default-Start: S
 ssh:7:# Default-Start: 2 3 4 5
 haveged:8:# Default-Start: 2 3 4 5
 hwclock.sh:26:# Default-Start: S
 plymouth:9:# Default-Start: 2 3 4 5
 motd:7:# Default-Start: 1 2 3 4 5
 killprocs:6:# Default-Start: 1
 networking:6:# Default-Start: S
 fake-hwclock:9:# Default-Start: S
 udev-mtab:6:# Default-Start: S
 apache2:6:# Default-Start: 2 3 4 5
 reboot:6:# Default-Start:
 umountfs:6:# Default-Start:
 plymouth-log:9:# Default-Start: S
 openvpn:11:# Default-Start: 2 3 4 5
 kmod:8:# Default-Start: S
 ntp:7:# Default-Start: 2 3 4 5
 rpcbind:9:# Default-Start: S 2 3 4 5
 urandom:6:# Default-Start: S
 rmnologin:6:# Default-Start: 2 3 4 5
 checkfs.sh:7:# Default-Start: S
 sudo:8:# Default-Start: 2 3 4 5
 mtab.sh:6:# Default-Start: S
 dbus:6:# Default-Start: 2 3 4 5
 rsync:8:# Default-Start: 2 3 4 5

这将在/etc/init.d/的所有文件中打印出以Default-Start开头的行,这也是标识各种服务的文件所在。这一行标识的是每个服务启动的运行级别。如果一个服务在运行级别N处启动,当系统发展到N+1时,就不需要再次启动,但如果发现它没有运行,就会被启动。

这样就可以准确地了解服务启动的不同阶段。但是在同一个运行级别中,"所需-启动 “和 "应该-启动 "这两行定义了相关服务的硬依赖和软依赖,即_在被检查的服务之前,必须运行和应该运行的服务。如果没有 Required-Start 服务,相关服务就会失败,如果没有 Should-Start 服务,反而不会出现一般的失败,可能只是缺少一些有用的功能。同样的情况在停止时也会发生,有了Required-Stop和Should-Stop。

SYSTEMD

列出所有服务的命令是

systemctl list-unit-files

会吐出很多信息。要选择所有的服务enabled,即那些在启动时启动的服务,只需grep上面的命令如下。

systemctl list-unit-files | grep enabled

我更喜欢这个命令,而不是systemctl list-units:不同的是,这个命令只显示操作系统在内存中的服务(即操作系统认为需要的服务),而systemctl list-unit-files将显示所有安装的服务,包括那些被屏蔽的服务(那些永远不会被启动的服务,甚至不能手动启动的服务),以及那些不会被**激活的服务,即static。换句话说,我建议的命令比只列出active_服务的命令更全面。

NB :systemd与以前的init系统有很大的不同。特别是,它没有runlevels,而是targets。由于兼容性的原因,runlevels仍然存在,并且可以通过

systemctl list-unit-files --type=target

列出所有可用的目标,而你可以通过

$ systemctl get-default
  graphical.target

来查看你当前的目标,关于这一点,你可以阅读 DigitalOcean的优秀介绍页

8
8
8
2015-04-09 19:26:26 +0000

对于Raspberry Pi上简单的启动服务管理,我推荐工具rcconf。它可以让你在/etc/init.d/中轻松开启/关闭服务。你也可以看到它们是否被启用并将在启动时运行。

安装工具

sudo apt-get install rcconf

而且使用文本用户界面

sudo rcconf
```非常简单。
3
3
3
2014-12-15 11:09:00 +0000
sudo nano /etc/rc.local

这里是你插入批处理文件或命令在启动时运行的地方。我也会在启动时自动运行Openvpn:)