systemctl
我刚刚在一台服务器上安装了 CentOS 7.1,但我对它与之相比的工作原理感到困惑service
。
在 CentOS 6 上,运行时我会得到反馈service
,例如:
root@centos6 [~]# service mysql restart
Shutting down MySQL........................................[ OK ]
Starting MySQL.............................................[ OK ]
root@centos6 [~]# service mysql status
MySQL running (910285) [ OK ]
root@centos6 [~]#
但是在 CentOS 7 上,当我使用 时systemctl
,什么也没得到。我不知道发生了什么,甚至不知道是否发生了什么:
root@centos7 [~]# systemctl restart mysql
root@centos7 [~]# /bin/systemctl restart mysql.service
# Nothing happened
当我service
在 CentOS 7 上运行时,发生了以下情况:
root@centos7 [~]# service mysql restart
Redirecting to /bin/systemctl restart mysql.service
我错过了什么?
答案1
这是我的做法:
systemctl start my-service && journalctl -fexu my-service
journalctl
是从 systemd 服务获取输出的最简单方法。
-f
my-service
遵循直到我退出(ctrl-C)的日志输出。-e
滚动到末尾(最新)日志消息。-x
如果有的话,请查阅期刊信息目录中的解释。
(另见 https://www.freedesktop.org/wiki/Software/systemd/catalog/)-u
将仅显示来自该my-service
单元的日志。
答案2
与任何好的 unix 命令一样,systemctl
除非出现问题,或者您运行了明确需要输出的命令,否则不会输出任何内容。如果您看不到任何内容,则表示命令成功。
如果您愿意,您可以运行systemctl status mysql
来查看其当前状态。
答案3
我对此的“解决方案”(很久以前就做过)是编写一个小脚本,基本上按照上面的答案之一的建议执行:systemctl restart myservice,然后立即执行 systemctl status myservice,这样您只需运行重新启动,然后获取状态。我也同意这是一个不必要的解决方案,因为 systemctl 应该已经实现了详细/状态选项,但事实就是如此。
答案4
不幸的是,systemctl
它不像大多数 Unix 命令那样提供“详细”选项。
一种解决方案是增加到SYSTEMD_LOG_LEVEL
(debug
这里info
没用),然后过滤输出,例如:
$ SERVICES="smartmontools cron xxxxx"
$ SYSTEMD_LOG_LEVEL=debug systemctl restart $SERVICES 2>&1|egrep "Got result .* for job|Failed"
Failed to restart xxxxx.service: Unit xxxxx.service not found.
Got result done/Success for job cron.service
Got result done/Success for job smartmontools.service
您还可以添加前缀,例如
$ SYSTEMD_LOG_LEVEL=debug systemctl restart $SERVICES 2>&1|egrep -i "Got result .* for job|Failed"|sed 's,^,restart: ,'
restart: Failed to restart xxxxx.service: Unit xxxxx.service not found.
restart: Got result done/Success for job cron.service
restart: Got result done/Success for job smartmontools.service
SYSTEMD_LOG_LEVEL
可能并非在所有系统上都可用。