SYSTEMCTL(1) | systemctl | SYSTEMCTL(1) |
systemctl - 控制 systemd 系统与服务管理器
systemctl [OPTIONS...] COMMAND [NAME...]
systemctl 可用于检查和控制 systemd(1) 系统与服务管理器的状态。
能够识别的命令行选项如下:
-t, --type=
在列出单元时,如果使用了此选项, 那么表示只列出指定类型的单元, 否则将列出所有类型的单元。
此外,作为特例,使用 --type=help 表示在列出所有可用的单元类型之后退出。
--state=
此外,作为特例,使用 --state=help 表示在列出所有可用的单元状态之后退出。
-p, --property=
不带参数的 systemctl show 命令 将会显示管理器(systemd)自身的属性(参见 systemd-system.conf(5) 手册)。
不同类型的单元拥有不同的属性集, 指定任意一个单元(即使并不存在),都可以查看此类单元的所有属性。 类似的,即使指定了一个不存在的任务(job),也能查看任务的所有属性。 每种单元能够拥有的属性集分散在 systemd.unit(5) 手册 以及此类单元专属的手册中,例如 systemd.service(5), systemd.socket(5) 等等。
-a, --all
如果想要列出所有已安装的单元,请使用 list-unit-files 命令。
-r, --recursive
--reverse
--after
注意,每个 After= 依赖都会自动生成一个对应的 Before= 依赖。 单元之间的先后顺序既可以被显式的明确设定, 也可以由其他指令隐式的自动生成(例如 WantedBy= 或 RequiresMountsFor=)。 无论是隐式自动生成的先后顺序, 还是显式明确设定的先后顺序, 都会被 list-dependencies 命令显示出来。
--before
-l, --full
--value
--show-types
--job-mode=
"fail" 表示当新任务与队列中已有的任务冲突时,该命令将失败。 所谓"冲突"的含义是:导致队列中已有的某个启动操作转变为停止操作,或者相反。
"replace" 表示将队列中冲突的任务替换为新任务。
"replace-irreversibly" 与 "replace" 类似, 不同之处在于将新任务同时标记为"不可撤销", 也就是即使未来与其他新添加的任务发生冲突也不会被撤消。 注意,这个"不可撤销"的任务, 仍然可以使用 cancel 命令显式的撤消。
"isolate" 仅用于启动操作,表示在该单元启动之后,所有其他单元都会被停止。 当使用 isolate 命令的时候, 这是默认值,且不能更改。
"flush" 表示撤消队列中已有的全部任务,然后加入新任务。
"ignore-dependencies" 表示忽略新任务的所有依赖关系(包括先后顺序依赖), 立即执行请求的操作。 如果成功, 那么所有被依赖的单元及先后顺序都将被忽略。 仅用于调试目的,切勿用于常规目的。
"ignore-requirements" 类似于 "ignore-dependencies" , 表示仅忽略必需的依赖(但依然遵守单元之间的先后顺序)。
--fail
当与 kill 命令一起使用时, 表示如果没有任何单元被杀死,那么将会导致报错。
-i, --ignore-inhibitors
-q, --quiet
--no-block
--user
--system
--no-wall
--global
--no-reload
--no-ask-password
--kill-who=
-s, --signal=
-f, --force
当与 edit 命令连用时, 表示创建所有尚不存在的指定单元。
当与 halt, poweroff, reboot, kexec 命令连用时,表示跳过单元的正常停止步骤,强制直接执行关机操作。 如果仅使用此选项一次,那么所有进程都将被强制杀死,并且所有文件系统都将被卸载(或以只读模式重新挂载)。 这可以算是一种野蛮但还算相对比较安全的快速关机或重启的方法。 如果连续两次使用此选项,那么将既不杀死进程,也不卸载文件系统, 而是直接强制关机或重启(但 kexec 除外)。 警告:连续两次使用 --force 选项将会导致数据丢失、文件系统不一致等不良后果。 注意,如果连续两次使用 --force 选项,那么所有操作都将由 systemctl 自己直接执行,而不会与 systemd 进程通信。 这意味着,即使 systemd 进程已经僵死或者崩溃,连续两次使用 --force 选项所指定的操作依然能够执行成功。
--message=
--now
--root=
--runtime
类似的,当与 set-property 命令连用时, 所做的变更亦是临时的, 这些变更在重启后亦会丢失。
--preset-mode=
-n, --lines=
-o, --output=
--firmware-setup
--plain
-H, --host=
-M, --machine=
--no-pager
--no-legend
-h, --help
--version
模式(PATTERN)参数的语法与文件名匹配语法类似:用"*"匹配任意数量的字符,用"?"匹配单个字符,用"[]"匹配字符范围。 如果给出了模式(PATTERN)参数,那么表示该命令仅作用于单元名称与至少一个模式相匹配的单元。
list-units [PATTERN...]
这是默认命令。
list-sockets [PATTERN...]
LISTEN UNIT ACTIVATES /dev/initctl systemd-initctl.socket systemd-initctl.service ... [::]:22 sshd.socket sshd.service kobject-uevent 1 systemd-udevd-kernel.socket systemd-udevd.service 5 sockets listed.
注意:因为监听地址中有可能包含空格, 所以不适合使用程序分析该命令的输出。
参见 --show-types, --all, --state= 选项。
list-timers [PATTERN...]
参见 --all 与 --state= 选项。
start PATTERN...
如果某个单元未被启动,又没有处于失败(failed)状态, 那么通常是因为该单元没有被加载,所以根本没有被模式匹配到。 此外,对于从模板实例化而来的单元,因为 systemd 会在其尚未启动前忽略它们, 又因为模式(PATTERN)参数仅能匹配已加载单元的"主名称"(不含单元的"别名"), 所以,在这个命令中使用包含通配符的模式并没有多少实际意义。
stop PATTERN...
reload PATTERN...
不要将此命令与 daemon-reload 命令混淆。
restart PATTERN...
try-restart PATTERN...
reload-or-restart PATTERN...
try-reload-or-restart PATTERN...
isolate NAME
这类似于传统上切换SysV运行级的概念。 该命令会立即停止所有在新目标单元中不需要的进程, 这其中可能包括当前正在运行的图形环境以及正在使用的终端。
注意,该命令仅可用于 AllowIsolate=yes 的单元。参见 systemd.unit(5) 手册。
kill PATTERN...
is-active PATTERN...
is-failed PATTERN...
status [PATTERN...|PID...]
此命令用于输出人类易读的结果,不要将其用于程序分析(应该使用 show 命令)。 除非使用了 --lines 与 --full 选项, 否则默认只输出10行日志, 并且超长的部分会被省略号截断。此外, journalctl --unit=NAME 或 journalctl --user-unit=NAME 也会对超长的消息使用类似的省略号截断。
show [PATTERN...|JOB...]
cat PATTERN...
set-property NAME ASSIGNMENT...
例如: systemctl set-property foobar.service CPUShares=777
注意,此命令可以同时修改多个属性值, 只需依次将各个属性用空格分隔即可。
与单元文件中的规则相同, 设为空表示清空当前已存在的列表。
help PATTERN...|PID...
reset-failed [PATTERN...]
list-dependencies [NAME]
默认情况下,仅以递归方式显示 target 单元的依赖关系树,而对于其他类型的单元,仅显示一层依赖关系(不递归)。 但如果使用了 --all 选项, 那么将对所有类型的单元都强制递归的显示完整的依赖关系树。
还可以使用 --reverse, --after, --before 选项指定仅显示特定类型的依赖关系。
list-unit-files [PATTERN...]
enable NAME..., enable PATH...
如果此命令的参数是一个有效的单元名称(NAME),那么将自动搜索所有单元目录。 如果此命令的参数是一个单元文件的绝对路径(PATH),那么将直接使用指定的单元文件。 如果参数是一个位于标准单元目录之外的单元文件, 那么将会在标准单元目录中额外创建一个指向此单元文件的软连接, 以确保该单元文件能够被 start 之类的命令找到。
除非使用了 --quiet 选项, 否则此命令还会显示对文件系统所执行的操作(Created symlink ...)。
此命令是维护 .{wants,requires}/ 目录与单元别名的首选方法。 注意,此命令仅会按照单元文件中 "[Install]" 小节预设的名称创建软链接。 另一方面,系统管理员亦可手动创建所需的软链接, 特别是在需要创建不同于默认软链接名称的时候。 不过需要注意的是,系统管理员必须在创建完软连接之后手动执行 daemon-reload 命令, 以确保所做的变更立即生效。
不要将此命令与 start 命令混淆,它们是相互独立的命令: 可以启动一个尚未启用的单元,也可以启用一个尚未启动的单元。 enable 命令只是设置了单元的启动钩子(通过创建软链接), 例如在系统启动时或者某个硬件插入时,自动启动某个单元。 而 start 命令则是具体执行单元的启动操作, 例如对于服务单元来说就是启动守护进程,而对于套接字单元来说则是绑定套接字,等等。
若与 --user 选项连用,则表示变更仅作用于用户实例,否则默认作用于系统实例(相当于使用 --system 选项)。 若与 --runtime 选项连用,则表示仅作临时性变更(重启后所有变更都将丢失),否则默认为永久性变更。 若与 --global 选项连用,则表示变更作用于所有用户(在全局用户单元目录上操作),否则默认仅作用于当前用户(在私有用户单元目录上操作)。 注意,当与 --runtime 选项连用时,systemd 守护进程不会重新加载自身的配置。
不可将此命令应用于已被 mask 命令屏蔽的单元,否则将会导致错误。
disable NAME...
此命令的参数仅能接受单元的名字,而不能接受单元文件的路径。
除了停用参数中明确指定的单元之外,那些在被停用单元 "[Install]" 小节的 Also= 选项中列出的所有单元,也同样会被停用。 也就是说,这个停用动作是沿着 Also= 选项不断传递的。
删除完软连接之后, systemd 将会自动重新加载自身的配置(相当于执行 daemon-reload 命令),以确保所做的变更立即生效。 注意,除非同时使用了 --now 选项(相当于同时执行 stop 命令), 否则停用一个单元并不会导致该单元被停止。
除非使用了 --quiet 选项, 否则此命令还会显示对文件系统所执行的操作(Removed symlink ...)。
有关 --system, --user, --runtime, --global 选项的影响,参见上面对 enable 命令的解释。
reenable NAME...
preset NAME...
可以使用 --preset-mode= 选项控制如何参照预设文件: 既启用又停用、仅启用、仅停用
如果指定单元的 "[Install]" 小节不包含必要的启用信息, 那么此命令将会悄无声息的忽略该单元。
有关预设文件的更多说明,详见 systemd.preset(5) 手册与 Preset[1] 文档。
preset-all
可以使用 --preset-mode= 选项控制如何参照预设文件: 既启用又停用、仅启用、仅停用
is-enabled NAME...
Table 1. is-enabled 命令的输出
状态 | 含义 | 返回值 |
"enabled" | 已经通过 /etc/systemd/system/*.{wants,requires}/ 目录下的软连接被永久启用 | 0 |
"enabled-runtime" | 已经通过 /run/systemd/system/*.{wants,requires}/ 目录下的软连接被临时启用 | 0 |
"linked" | 虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软连接已经存在于 /etc/systemd/system/ 永久目录中 | > 0 |
"linked-runtime" | 虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软连接已经存在于 /run/systemd/system/ 临时目录中 | > 0 |
"masked" | 已经被 /etc/systemd/system/ 目录永久屏蔽(软连接指向 /dev/null 文件),因此 start 操作会失败 | > 0 |
"masked-runtime" | 已经被 /run/systemd/systemd/ 目录临时屏蔽(软连接指向 /dev/null 文件),因此 start 操作会失败 | > 0 |
"static" | 尚未被启用,并且单元文件的 "[Install]" 小节中没有可用于 enable 命令的选项 | 0 |
"indirect" | 尚未被启用,但是单元文件的 "[Install]" 小节中 Also= 选项的值列表非空(也就是列表中的某些单元可能已被启用) | 0 |
"disabled" | 尚未被启用,但是单元文件的 "[Install]" 小节中存在可用于 enable 命令的选项 | > 0 |
"generated" | 单元文件是被单元生成器动态生成的(参见 systemd.generator(7) 手册)。被生成的单元文件可能并未被直接启用,而是被单元生成器隐含的启用了。 | 0 |
"transient" | 单元文件是被运行时API动态临时生成的。该临时单元可能并未被启用。 | 0 |
"bad" | 单元文件不正确或者出现其他错误。 is-enabled 不会返回此状态,而是会显示一条出错信息。 list-unit-files 命令有可能会显示此单元。 | > 0 |
mask NAME...
unmask NAME...
link PATH...
revert NAME...
从效果上看,该命令相当于撤销 edit, set-property, mask 命令所做的操作, 并且将指定单元的配置恢复成软件包提供的初始值。
add-wants TARGET NAME..., add-requires TARGET NAME...
关于 --system, --user, --runtime, --global 选项的影响, 参见前文对 enable 命令的解释。
edit NAME...
若使用了 --full 选项,则表示使用新编辑的单元文件完全取代原始单元文件, 否则默认将新编辑的单元配置片段(位于 .d/ 目录)附加到原始单元文件的末尾。
如果使用了 --force 选项,并且某些指定的单元文件不存在, 那么将会强制打开一个新的空单元文件以供编辑。
注意,在编辑过程中,编辑器实际操作的只是临时文件, 仅在编辑器正常退出时,临时文件的内容才会被实际写入到目标文件中。
注意,如果在编辑器退出时,临时文件的内容为空, 则表示取消编辑动作(而不是写入一个空文件)。
编辑动作完成之后,systemd 将会自动重新加载自身的配置(相当于执行 daemon-reload 命令),以确保所做的变更立即生效。
关于 --system, --user, --runtime, --global 选项的影响, 参见前文对 enable 命令的解释。
注意:(1)该命令不可用于编辑远程主机上的单元文件。 (2)禁止在编辑 /etc 中的原始单元文件时使用 --runtime 选项, 因为 /etc 中的单元文件优先级高于 /run 中的单元文件。
get-default
set-default NAME
list-machines [PATTERN...]
list-jobs [PATTERN...]
cancel JOB...
show-environment
set-environment VARIABLE=VALUE...
unset-environment VARIABLE...
import-environment [VARIABLE...]
daemon-reload
不要将此命令与 reload 命令混淆。
daemon-reexec
is-system-running
Table 2. is-system-running 命令的输出
状态 | 含义 | 返回值 |
initializing | 启动的早期阶段。也就是尚未到达 basic.target/rescue.target/emergency.target 之前的阶段。 | > 0 |
starting | 启动的晚期阶段。 也就是任务队列首次达到空闲之前的阶段, 或者已经启动到了某个救援 target 中。 | > 0 |
running | 完成了全部的启动操作,整个系统已经处于完全可用的状态, 并且没有任何单元处于失败(failed)状态。 | 0 |
degraded | 完成了全部的启动操作,系统已经可用, 但是某些单元处于失败(failed)状态。 | > 0 |
maintenance | 启动了 rescue.target/emergency.target 目标。 | > 0 |
stopping | 系统正处于关闭过程中。 | > 0 |
offline | 整个系统已经处于完全可用的状态, 但init进程(PID=1)不是 systemd | > 0 |
unknown | 由于资源不足或未知原因, 无法检测系统的当前状态 | > 0 |
default
rescue
emergency
halt
poweroff
reboot [arg]
若给出了可选的 arg 参数, 那么将会被作为可选参数传递给 reboot(2) 系统调用。 其取值范围依赖于特定的硬件平台。 例如 "recovery" 有可能表示触发系统恢复动作, 而 "fota" 有可能表示 “firmware over the air” 固件更新。
kexec
exit [EXIT_CODE]
此命令相当于 poweroff 命令, 但仅可用于用户实例(也就是以 --user 选项启动的实例)或容器, 否则会执行失败。
switch-root ROOT [INIT]
suspend
hibernate
hybrid-sleep
单元命令的参数可能是一个单独的单元名称(NAME), 也可能是多个匹配模式(PATTERN...)。 对于第一种情况,如果省略单元名称的后缀,那么默认以 ".service" 为后缀, 除非那个命令只能用于某种特定类型的单元。例如
# systemctl start sshd
等价于
# systemctl start sshd.service
, 而
# systemctl isolate default
等价于
# systemctl isolate default.target
,因为 isolate 命令只能用于 .target 单元。 注意,设备文件路径(绝对路径)会自动转化为 device 单元名称,其他路径(绝对路径)会自动转化为 mount 单元名称。 例如,如下命令
# systemctl status /dev/sda # systemctl status /home
分别等价于
# systemctl status dev-sda.device # systemctl status home.mount
对于第二种情况,可以在模式中使用shell风格的匹配符,对所有已加载单元的主名称(primary name)进行匹配。 如果没有使用匹配符并且省略了单元后缀,那么处理方式与第一种情况完全相同。 这就意味着:如果没有使用匹配符,那么该模式就等价于一个单独的单元名称(NAME),只表示一个明确的单元。 如果使用了匹配符,那么该模式就可以匹配任意数量的单元(包括零个)。
模式使用 fnmatch(3) 语法, 也就是可以使用shell风格的 "*", "?", "[]" 匹配符(详见 glob(7))。 模式将基于所有已加载单元的主名称(primary name)进行匹配, 如果某个模式未能匹配到任何单元,那么将会被悄无声息的忽略掉。 例如
# systemctl stop sshd@*.service
命令将会停止所有 sshd@.service 的实例单元。 注意,单元的别名(软连接)以及未被加载的单元,不在匹配范围内(也就是不作为匹配目标)。
对于单元文件命令,NAME 参数必须是单元名称(完整的全称或省略了后缀的简称)或单元文件的绝对路径。 例如:
# systemctl enable foo.service
或
# systemctl link /path/to/foo.service
返回值为 0 表示成功, 非零返回值表示失败代码。
$SYSTEMD_EDITOR
$SYSTEMD_PAGER
$SYSTEMD_LESS
systemd(1), journalctl(1), loginctl(1), machinectl(1), systemd.unit(5), systemd.resource-control(5), systemd.special(7), wall(1), systemd.preset(5), systemd.generator(7), glob(7)
本页面中文版由中文 man 手册页计划提供。
翻译人员:金步国
金步国作品集:http://www.jinbuguo.com
中文 man
手册页计划:https://github.com/man-pages-zh/manpages-zh
systemd 231 |