服务常用命令

# 简介

# 安装后的路径

/etc/init.d
1

# 命令管理

systemctl命令是系统服务管理器指令,融合了service和chkconfig的功能,可以查看和设置服务。

# 利用systemctl命令管理

显示服务状态

systemctl status docker.service
1

列出服务层级和依赖关系

systemctl list-dependencies docker.service
1

启动服务

systemctl start docker.service
1

关闭服务

systemctl stop docker.service
1

重启服务

systemctl restart docker.service
1

查看docker运行状态

systemctl status docker
1

设置服务自启动

systemctl enable docker.service
1

禁止服务自启动

systemctl disable docker.service
1

查看服务是否自启动

systemctl is-enabled docker.service
1

列出系统所有服务的启动情况

systemctl list-units --type=service
1

列出所有自启动服务

systemctl list-unit-files|grep enabled
1

# 对应的旧指令(chkconfig、service)

显示服务状态

service docker status
1

列出服务层级和依赖关系

systemctl list-dependencies docker.service
1

启动服务

service docker start
1

关闭服务

service docker stop
1

重启服务

service docker restart
1

设置服务自启动

chkconfig --level 3 docker on
1

禁止服务自启动

chkconfig --level 3 docker off
1

查看服务是否自启动

chkconfig --list docker
1

列出系统所有服务的启动情况

chkconfig --list
1

# 常用命令

  • systemctl --version,查看版本。
  • whereis systemctl,查看位置。
  • systemctl list-unit-files,列出所有可用单元(服务)。
  • systemctl list-units,列出所有运行中的单元。
  • systemctl --failed,列出所有失败的单元。
  • systemctl list-unit-files | grep enable,查看自启动的软件。
  • systemctl is-enabled mysqld.service,查看某个单元是否开机启动。
  • systemctl status mysqld.service,查看某个单元的状态。
  • systemctl start mysqld.service,启动某个单元。
  • systemctl restart mysqld.service,重启某个单元。
  • systemctl stop mysqld.service,停止某个单元。
  • systemctl daemon-reload,修改了某个单元的配置文件后,重载配置文件。
  • systemctl reload mysqld.service,重载某个单元。
  • systemctl enable mysqld.service,设置开机自启动。
  • systemctl disable mysqld.service,关闭开机自启动。
  • systemctl kill mysqld,杀死单元。
# systemctl start nginx.service          启动nginx服务
# systemctl stop nginx.service           停止服务
# systemctl restart nginx.service        重新启动服务
# systemctl list-units --type=service     查看所有已启动的服务
# systemctl status nginx.service          查看服务当前状态
# systemctl enable nginx.service          设置开机自启动
# systemctl disable nginx.service         停止开机自启动
1
2
3
4
5
6
7

一个常见的错误

Warning: nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.

直接按照提示执行命令systemctl daemon-reload 即可。

# systemctl daemon-reload
1

# 辅助功能

# shell脚本判断某服务是否运行

shell脚本判断某服务是否开启

#!/bin/bash
#检查服务状态,是否安装
read -p "请输入要检测的服务:" SERVICE
netstat -anp | grep $SERVICE &> /dev/null
if [ $? -eq 0 ]
then
  echo "$SERVICE服务已经启动!"
else
  rpm -q $SERVICE &> /dev/null
 
  if [ $? -eq 0 ]
  then
 echo "$SERVICE服务已安装,正在启动...."
    service $SERVICE start
  else
 echo "该服务未安装!"
 fi
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 监听mysql服务是否启动

# 方式一

脚本

mysql_listen.sh

#!/bin/bash
pgrep mysqld &> /dev/null
if [ $? -gt 0 ] then
  #echo "`date` mysql is stop"
  echo "`date` mysql is stop" >> /var/log/mysql_listen.log
  service mysql start
else
  #echo "`date` mysql running"
  echo "`date` mysql running" >> /var/log/mysql_listen.log
fi

#echo "[$(date '+%Y-%m-%d %H:%M:%S')] [INFO] Mysql is up, Will be starting Pro"
1
2
3
4
5
6
7
8
9
10
11
12
  • 其中 pgrep mysqld 是监测 mysqld 服务的运行状态;
  • &> /dev/null 是将其结果输出到空文件,也就是不保存输出信息
  • $? 是拿到上一条命令的运行结果,-gt 0 是判断是否大于 0,
  • 后面则是输出时间到日志文件;

chmod 777 mysql_listen.sh

添加定时任务

好了,脚本可以顺利执行了,那么我们就需要定时调用一下这个脚本来运行了,我们需要用到 cron。 首先我们需要编辑一下 corn 调度表格,命令如下:

crontab -e
1

如果你是第一次编辑这个,他会让你选择文件打开方式,随便选一个数字就好了。 比如我们用 GNU 打开的,我们就在它的最后一行添加下面的一句话即可。

*/5 * * * * /etc/mysql/mysql_listen.sh
1

/5 代表五分钟执行一次,后面的四个点依次代表了,小时,日,月,星期。如果想要时间长一些,比如一小时调度一次,那就设置一下后面第一个 * 就好了。 好,保存一下,重启 cron 服务。

定时启动:service cron restart

# 方式二【推荐】

双保险,进程和端口都成功才算mysql服务正常;

#!/bin/bash
port=`netstat -nlt|grep 3306|wc -l`
process=`ps -ef |grep mysql|grep -v grep |wc -l`
if [ $port -eq 1 ] && [ $process -eq 2 ]
then
   echo "MySQL is running"
else
   /etc/init.d/mysqld start
fi
1
2
3
4
5
6
7
8
9

使用客户端登录mysql执行命令,查看返回结果测试服务是否启动,理论上此方法最可靠。

check_db_client.sh

#!/bin/bash
mysql -uroot -p123456 -e "select version();" &>/dev/null
if [ $? -ne 0 ]
then
 /etc/init.d/mysqld start
else
 echo "MySQL is running"
fi
1
2
3
4
5
6
7
8

# 监听docker容器状态【要点】

shell 监听docker 容器是否正常运行,并重启;

# 脚本及定时启动

listen_container_mysql.sh

#检查是否有这个容器是否已经创建,有的话,重启容器;没有的话run重启运行一个;
# docker ps -a | grep $PRO_NAME
1
2
#!/bin/bash
#监控容器的运行状态
#容器名称  传入参数
containerName=$1
#当前时间
currTime=`date +"%Y-%m-%d %H:%M:%S"`
# 查看进程是否存在
exist=`docker inspect --format '{{.State.Running}}' ${containerName}`
if [ "${exist}" != "true" ];then 
  echo "${currTime} 重启docker容器,容器名称:${containerName}" >> /opt/listen/logs/mysl.log
    docker start ${containerName}
else
    echo "${currTime} 容器名称:${containerName} 正常" >>/opt/listen/logs/mysl.log
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14

试运行脚本,检查脚本是否能够正常启动,不报错

sh /opt/listen/listen_container_mysql.sh 6fb4c99476a0  
1

加入定时任务crontab -e;每个一分钟执行一次脚本

*/1 * * * * sh /opt/listen/listen_container_mysql.sh 6fb4c99476a0  >/dev/null 2>&1
1
# 监控docker 8081 容器
*/1 * * * * sh /mnt/xvde1/ms_ctynyd/scripts/wbwf_monitor.sh server_wbwf_wbwf-app_1
# 监控 docker 7081 容器
*/1 * * * * sh /mnt/xvde1/ms_ctynyd/scripts/wbwf_monitor.sh server_hb_hb-test-app_1
1
2
3
4

重新载入

service crond reload
1
  • 安装crontab:
yum install crontabs
1

# crontab服务操作说明

  • service crond start //启动服务
  • service crond stop //关闭服务
  • service crond restart //重启服务
  • service crond reload //重新载入配置
  • service crond status // 查看状态
  • crontab -l //查询定时任务列表

# 检测进程httpd是否存在【推荐】

# 编码实现

#!/bin/sh
while true;do
  count=`ps -ef|grep http|grep -v grep`
  #if [ $? -ne 0 ];then
  if [ "$?" != "0" ];then
    echo  ">>>>no httpd,run it"
    service httpd start
  else
    echo ">>>>httpd is runing..."
  fi
    sleep 5
done
1
2
3
4
5
6
7
8
9
10
11
12

# 分析说明

例如需要检测进程httpd是否存在,操作流程如下:

  1. 读取系统所有进程
  2. 判断包含指定进程名字的信息是否存在

通过管道连接,命令如下:

ps axu | grep "httpd" | grep -v "grep" | wc -l

所有进程-->获取包含“httpd”的行-->删除grep进程信息-->输出最后的行数

通过判断命令的执行结果是否为 0 ,可以知道进程是否存在。

# shell基本命令

  • ps aux 显示系统全部进程,一行一个;
  • grep “abc” 从标准输入读取字符流,输出包含字符串“abc”的行;
  • grep -v "acb" 从标准输入读取字符流,输出不包含字符串“abc”的行
  • wc -l 从标准输入读取字符流,输出行数;
  • $? 是拿到上一条命令的运行结果,$? -ne 0 不存在,$? -eq 0 存在

其他示范:

#!/bin/sh
ps -fe|grep processString |grep -v grep
if [ $? -ne 0 ];then
 echo "start process....."
else
 echo "runing....."
fi
##### processString 表示进程特征字符串,能够查询到唯一进程的特征字符串
1
2
3
4
5
6
7
8
crontab -e
0 04,12,21 * * * /bin/bash /home/mysh/monitorprocess.sh
#每天晚上4点,中午12点,晚上21点检测
1
2
3
上次更新: 2022/04/15, 05:41:32
×