服务常用命令
# 简介
# 安装后的路径
/etc/init.d
# 命令管理
systemctl命令是系统服务管理器指令,融合了service和chkconfig的功能,可以查看和设置服务。
# 利用systemctl命令管理
显示服务状态
systemctl status docker.service
列出服务层级和依赖关系
systemctl list-dependencies docker.service
启动服务
systemctl start docker.service
关闭服务
systemctl stop docker.service
重启服务
systemctl restart docker.service
查看docker运行状态
systemctl status docker
设置服务自启动
systemctl enable docker.service
禁止服务自启动
systemctl disable docker.service
查看服务是否自启动
systemctl is-enabled docker.service
列出系统所有服务的启动情况
systemctl list-units --type=service
列出所有自启动服务
systemctl list-unit-files|grep enabled
# 对应的旧指令(chkconfig、service)
显示服务状态
service docker status
列出服务层级和依赖关系
systemctl list-dependencies docker.service
启动服务
service docker start
关闭服务
service docker stop
重启服务
service docker restart
设置服务自启动
chkconfig --level 3 docker on
禁止服务自启动
chkconfig --level 3 docker off
查看服务是否自启动
chkconfig --list docker
列出系统所有服务的启动情况
chkconfig --list
# 常用命令
- 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 停止开机自启动
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
# 辅助功能
# 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
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"
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
如果你是第一次编辑这个,他会让你选择文件打开方式,随便选一个数字就好了。 比如我们用 GNU 打开的,我们就在它的最后一行添加下面的一句话即可。
*/5 * * * * /etc/mysql/mysql_listen.sh
/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
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
2
3
4
5
6
7
8
# 监听docker容器状态【要点】
shell 监听docker 容器是否正常运行,并重启;
# 脚本及定时启动
listen_container_mysql.sh
#检查是否有这个容器是否已经创建,有的话,重启容器;没有的话run重启运行一个;
# docker ps -a | grep $PRO_NAME
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
2
3
4
5
6
7
8
9
10
11
12
13
14
试运行脚本,检查脚本是否能够正常启动,不报错
sh /opt/listen/listen_container_mysql.sh 6fb4c99476a0
加入定时任务crontab -e
;每个一分钟执行一次脚本
*/1 * * * * sh /opt/listen/listen_container_mysql.sh 6fb4c99476a0 >/dev/null 2>&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
2
3
4
重新载入
service crond reload
- 安装crontab:
yum install crontabs
# 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
2
3
4
5
6
7
8
9
10
11
12
# 分析说明
例如需要检测进程httpd是否存在,操作流程如下:
- 读取系统所有进程
- 判断包含指定进程名字的信息是否存在
通过管道连接,命令如下:
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 表示进程特征字符串,能够查询到唯一进程的特征字符串
2
3
4
5
6
7
8
crontab -e
0 04,12,21 * * * /bin/bash /home/mysh/monitorprocess.sh
#每天晚上4点,中午12点,晚上21点检测
2
3