Skip to main content

systemctl 安装、使用和Waring修复

安装

用apt安装systemctl

################# 安装systemctl #################
$ apt update
$ apt search systemctl
$ apt show systemctl
$ apt install systemctl
################# 安装systemctl #################

使用

常用操作

################# 常用操作 #################
# 启动服务
$ systemctl start 服务名
# 停止服务
$ systemctl stop 服务名
# 重启服务
$ systemctl restart 服务名
# 重新加载服务配置(不重启服务)
$ systemctl reload 服务名
# 查看服务状态
$ systemctl status 服务名
# 查看所有已启动的服务
$ systemctl list-units --type=service --state=running
# 查看所有服务(包括未启动)
$ systemctl list-units --type=service --all
# 启用服务开机自启动
$ systemctl enable 服务名
# 查看服务是否开机启动
$ systemctl is-enabled 服务名
# 查看unit的配置文件
$ systemctl cat nginx
################# 常用操作 #################

systemctl日志查看

################# journalctl查看日志 #################
# 查看服务日志
$ journalctl -u 服务名
# 实时查看日志
$ journalctl -f
# 查看开机后的日志
$ journalctl -b
################# journalctl查看日志 #################

Waring修复

SyntaxWarning修复

执行systemctl restart nginx 后,出现SyntaxWarning:

/usr/bin/systemctl:1541: SyntaxWarning: invalid escape sequence '\w'
expanded = re.sub("[$](\w+)", lambda m: get_env1(m), cmd.replace("\\\n",""))
/usr/bin/systemctl:1543: SyntaxWarning: invalid escape sequence '\w'
new_text = re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), expanded)
/usr/bin/systemctl:1628: SyntaxWarning: invalid escape sequence '\w'
cmd3 = re.sub("[$](\w+)", lambda m: get_env1(m), cmd2)
/usr/bin/systemctl:1631: SyntaxWarning: invalid escape sequence '\w'
newcmd += [ re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), part) ]
root@374f75b5dcdb:/etc/nginx/conf.d# systemctl status nginx
/usr/bin/systemctl:1541: SyntaxWarning: invalid escape sequence '\w'
expanded = re.sub("[$](\w+)", lambda m: get_env1(m), cmd.replace("\\\n",""))
/usr/bin/systemctl:1543: SyntaxWarning: invalid escape sequence '\w'
new_text = re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), expanded)
/usr/bin/systemctl:1628: SyntaxWarning: invalid escape sequence '\w'
cmd3 = re.sub("[$](\w+)", lambda m: get_env1(m), cmd2)
/usr/bin/systemctl:1631: SyntaxWarning: invalid escape sequence '\w'
newcmd += [ re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), part) ]

这些 SyntaxWarning 是因为 Python 3.6+ 中对字符串中的 无效转义字符(例如 \w)会发出警告。re 模块的正则表达式字符串中,\w 是特殊字符,必须以 原始字符串(raw string) 格式表示,否则会被解释为无效的转义序列。

例如: ​ • "\w" 会被解释为无效的转义。 ​ • r"\w" 是正确的,表示正则表达式中的 匹配单词字符

################# 临时解决方案 #################
# 这种情况是因为系统上的 systemctl 脚本使用了 Python 且代码不符合新的 Python 规范。可以通过临时禁用警告解决,在执行 systemctl 命令前,设置 PYTHONWARNINGS 环境变量:
$ export PYTHONWARNINGS="ignore::SyntaxWarning"
$ systemctl restart nginx
################# 临时解决方案 #################

################# 永久解决方案 #################
# 要永久解决该问题,需要修复 Python 脚本 /usr/bin/systemctl 中的正则表达式。将普通字符串改为 原始字符串:
# 1 备份systemctl
$ cp /usr/bin/systemctl /var/cp/systemctl
# 2 vim编辑systemctl
$ vim /usr/bin/system
# 3 修改以下的相关内容
expanded = re.sub("[$](\w+)", lambda m: get_env1(m), cmd.replace("\\\n",""))
new_text = re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), expanded)
cmd3 = re.sub("[$](\w+)", lambda m: get_env1(m), cmd2)
newcmd += [ re.sub("[$][{](\w+)[}]", lambda m: get_env2(m), part) ]
# 修改为:
expanded = re.sub(r"[$](\w+)", lambda m: get_env1(m), cmd.replace("\\\n",""))
new_text = re.sub(r"[$][{](\w+)[}]", lambda m: get_env2(m), expanded)
cmd3 = re.sub(r"[$](\w+)", lambda m: get_env1(m), cmd2)
newcmd += [ re.sub(r"[$][{](\w+)[}]", lambda m: get_env2(m), part) ]
# 4 保存退出 并验证
$ systemctl restart nginx
$ systemctl status nginx
################# 永久解决方案 #################