systemctl是Linux系统上用来管理和查看服务的工具,简单来说就是控制和管理系统。现在大部分的系统都打包了这个工具,所以学会使用systemctl对使用Linux有很大的帮助。文章目录
systemd在Linux内核启动后初始化用户组件,并在系统的整个生命周期中不断维护这些组件。这些任务称为服务单元,每个服务单元配置文件都有一个对应的服务单元文件。服务单元可能涉及安装存储设备(.mount),配置硬件(.device),套接字(.socket),或者(如本指南中所述)管理服务(.service)。systemd在当前会话中启动服务,使用以下start命令:sudo systemctl start apache2.service相反,要停止systemd服务,使用以下stop命令:sudo systemctl stop apache2.service在上面的示例中,我们启动然后停止了Apache服务。重要的是要注意,在使用服务单元时systemctl不需要.service扩展。以下是可以接受的:sudo systemctl start apache2如果需要重新启动服务(例如重新加载配置文件),则可以使用以下restart命令:sudo systemctl restart apache2同样,如果服务不需要重新启动即可重新加载其配置,则可以使用以下reload命令:sudo systemctl reload apache2最后,reload-or-restart如果不确定应用程序是需要重新启动还是只是重新加载,则可以使用该命令。sudo systemctl reload-or-restart apache2上面的命令对于在单个会话中管理服务非常有用,但是在启动时也需要许多服务。要在启动时启用服务:
sudo systemctl enable nginx要从启动时禁用该服务,使用以下disable命令:sudo systemctl disable nginx如果服务单元文件不在已知systemd文件路径之一内,则可以提供要启用的服务单元文件的文件路径:sudo systemctl enable /path/to/myservice.service但是,此文件需要systemd在启动时进行访问。例如,/home或/var`不允许开机启动,除非这些目录位于根文件系统上。systemctl 使我们可以检查单个服务的状态:systemctl status mysql这将导致出现类似于以下输出的消息:
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2018-08-30 09:15:35 EDT; 1 day 5h ago
Main PID: 711 (mysqld)
Tasks: 31 (limit: 2319)
CGroup: /system.slice/mysql.service
└─711 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid您还可以使用is-active,is-enabled和is-failed监视服务状态:systemctl is-enabled mysql要查看systemd系统上当前正在激活的服务单元,使用以下list-units命令并按服务类型进行过滤:systemctl list-units --type=service生成的列表包括所有当前活动的服务单元,具有待处理作业的服务单元以及活动和失败的服务单元:
UNIT LOAD ACTIVE SUB DESCRIPTION
accounts-daemon.service loaded active running Accounts Service
apparmor.service loaded active exited AppArmor initialization
apport.service loaded active exited LSB: automatic crash report generation
atd.service loaded active running Deferred execution scheduler
blk-availability.service loaded active exited Availability of block devices
console-setup.service loaded active exited Set console font and keymap
cron.service loaded active running Regular background program processing daemon
dbus.service loaded active running D-Bus System Message Bus
ebtables.service loaded active exited ebtables ruleset management
...输出提供五段数据:
--all标志:systemctl list-units --type=service --all您可以按状态过滤服务单元列表。提供以逗号分隔的服务单元状态列表,以将其输出为--state标志的值:systemctl list-units --type=service --all --state=exited,inactive要检索失败服务单元的列表,请输入list-units带有--failed标志的命令:systemctl list-units --failed每个单元都有一个对应的单元文件。这些服务单元配置文件文件通常位于以下目录中:
/lib/systemd/system目录包含系统提供的单元文件或已安装的软件包提供的单元文件。/etc/systemd/system目录存储用户提供的服务单元配置文件文件。systemd系统上安装的所有服务单元文件,请使用list-unit-files带有可选--type标志的命令:systemctl list-unit-files --type=service生成的列表有两列,UNIT FILE和STATE:
UNIT FILE STATE
accounts-daemon.service enabled
acpid.service disabled
apparmor.service enabled
[email protected] static
apt-daily-upgrade.service static
apt-daily.service static
...单元的状态可以启用,禁用,静态,屏蔽或生成。处于静态状态的单元文件不包含“ _安装”_部分,或者是要运行一次,或者它们是另一个单元文件的依赖项,因此不应单独运行。
cat命令:systemctl cat cron# /lib/systemd/system/cron.service [Unit] Description=Regular background program processing daemon Documentation=man:cron(8) [Service] EnvironmentFile=-/etc/default/cron ExecStart=/usr/sbin/cron -f $EXTRA_OPTS IgnoreSIGPIPE=false KillMode=process [Install] WantedBy=multi-user.target如果对单元文件的最新更改尚未加载到systemd中,则systemctl cat命令的输出可能是该服务的较旧版本。要获取服务单元配置文件文件的低级视图,使用以下show命令:systemctl show cron这将为服务单元配置文件文件中定义的所有非空属性生成一个属性键=值对的列表:
Type=simple
Restart=no
NotifyAccess=none
RestartUSec=100ms
TimeoutStartUSec=1min 30s
TimeoutStopUSec=1min 30s
RuntimeMaxUSec=infinity
...要显示空的属性值,请提供--all标志。要按属性过滤键值对,请使用-p标志:systemctl show cron -p Names请注意,属性名称必须大写。
list-dependencies命令:systemctl list-dependencies cron生成的输出将显示一个单元依赖关系树,该单元依赖关系必须在有关服务运行之前运行。
cron.service
● ├─system.slice
● └─sysinit.target
● ├─apparmor.service
● ├─blk-availability.service
● ├─dev-hugepages.mount
● ├─dev-mqueue.mount
● ├─friendly-recovery.service
...递归依赖性仅列出.target文件。要列出所有递归依赖项,请传递该--all标志。要检查哪些服务单元配置文件文件依赖于服务服务单元配置文件文件,可以运行list-dependencies带有--reverse标志的命令:systemctl list-dependencies cron --reversesystemctl。edit命令在系统的默认文本编辑器中打开一个空白的摘录片段文件:sudo systemctl edit ssh
当文件被保存,systemctl会创建一个名为文件override.conf的目录下时/etc/systemd/system/yourservice.service.d,这里yourservice是您选择要编辑服务的名称。此命令对于更改服务单元配置文件文件的一些属性很有用。edit命令与--full标志一起使用:sudo systemctl edit ssh –full
此命令将打开您选择在文本编辑器中编辑的任何服务单元配置文件文件的完整副本。保存文件后,systemctl将在创建文件/etc/systemd/system/yourservice.service。如果您需要对现有服务单元配置文件文件进行许多更改,这将很有用。/etc/systemd/system都会覆盖中的相应文件/lib/systemd/system。systemctl如果你试图打开一个不存在的服务单元配置文件文件将抛出一个错误,您可以强制systemctl使用,以创建一个新的单元文件--force的标志:sudo systemctl edit yourservice.service --force保存文件后,systemctl将override.conf在/etc/systemd/system/yourservice.service.d目录中创建一个文件,其中“ yourservice”是您选择创建的服务的名称。要创建完整的服务单元配置文件文件而不是仅片段,请--force与串联使用--full:sudo systemctl edit yourservice.service --force --fullmask命令将服务符号链接到/dev/null:sudo systemctl mask mysql与禁用服务类似,该mask命令不会阻止服务继续运行。要屏蔽服务并同时停止服务,请使用--now开关:sudo systemctl mask mysql --now要取消屏蔽服务,请使用以下unmask命令:sudo systemctl unmask mysqledit命令创建的单元文件摘要,请删除目录yourservice.service.d(其中“ yourservice”是您要删除的服务)以及override.conf目录中的文件:sudo rm -r /etc/systemd/system/yourservice.service.d要删除完整的服务单元配置文件文件,请运行以下命令:
sudo rm /etc/systemd/system/yourservice.service使用以下命令后,请重新加载systemd守护程序,使其不再尝试引用已删除的服务:sudo systemctl daemon-reload