开机自动启动RabbitMQ消费端

#!/usr/bin/env bash
# +-------------------------------------------------------------------------
# | 启动RabbitMQ消费端
# | 备注①:把当前文件的硬盘路径追加到/etc/rc.d/rc.local文件尾部。
# | 备注②:当前文件需要有执行权限。
# | 备注③:RabbitMQ消费端依赖RabbitMQ服务和MySQL服务(即必须等这两个服务启
# |         动之后再CLI执行PHP脚本)。
# +-------------------------------------------------------------------------

######################### 以下变量请根据实际情况设置·开始 #########################

# PHP可执行文件
php="/program/php/bin/php"

# RabbitMQ的消息消费端(在后台执行)
consumer="/inetpub/wwwroot/www_domain_com/lib/MQConsumer.php"

# MySQL进程的PID文件(上面的PHP脚本依赖MySQL,需要通过PID文件来检查MySQL是否已启动)
mysql_pid="/program/mysql/mysql.pid"

######################### 以下变量请根据实际情况设置·结束 #########################

# 当前时间戳
timestamp_now=$(date '+%s')

# 启动RabbitMQ消费端的时间期限(若干秒后MySQL还未启动就取消启动RabbitMQ消费端)
timestamp_deadline=$((${timestamp_now} + 180))

while [ ${timestamp_now} -le ${timestamp_deadline} ]; do
    # 检查MySQL服务是否已启动
    if [ -f ${mysql_pid} ]; then
        mysql_start="Y"
    else
        mysql_start="N"
    fi

    # 检查RabbitMQ服务是否已启动
    rabbitmq_status=$(/usr/bin/systemctl status rabbitmq.service)
    if [[ ${rabbitmq_status} =~ "Active: active" ]]; then
        rabbitmq_start="Y"
    else
        rabbitmq_start="N"
    fi

    if [ ${mysql_start} == "Y" -a ${rabbitmq_start} == "Y" ]; then
        # 休眠10秒后再启动RabbitMQ的消息消费端
        sleep 10s

        # 启动RabbitMQ的消息消费端(通过“nohup …… >/dev/null 2>&1 &”实现在后台执行)
        nohup ${php} ${consumer} >/dev/null 2>&1 &

        # RabbitMQ的消息消费端启动成功,可以退出while循环
        break
    else
        # 休眠1秒再进行下一轮循环
        sleep 1s

        timestamp_now=$(date '+%s')
    fi
done

停止RabbitMQ消费端的方法
[root@localhost ~]# ps aux | grep php # 查出进程PID
[root@localhost ~]# kill 1628 # 使用kill命令结束进程,其中1628为上面命令查出的进程PID





上面是最简单的开机自动启动方式,但是强烈建议创建service通过systemd来管理,这样就可以使用systemctl命令很方便地管理服务(包括start、stop、restart、status、enable、disable等各种常用管理操作)。
 
首先创建service的ExecStart脚本文件(/shell/MQConsumer.sh),代码如下:
 
#!/usr/bin/env bash
# +-------------------------------------------------------------------------
# | 消息队列消费者service脚本
# +-------------------------------------------------------------------------

########## 以下变量根据实际情况修改·开始 ##########
PHP='/program/php/bin/php'                                    # PHP程序路径
CONSUMER='/inetpub/wwwroot/www_domain_com/lib/MQConsumer.php' # 消息队列消费者PHP脚本文件路径
REDIS_PIDFILE='/program/redis/redis.pid'                      # Redis的pid文件路径
MYSQL_PIDFILE='/program/mysql/mysql.pid'                      # MySQL的pid文件路径
########## 以下变量根据实际情况修改·结束 ##########

# 消费者依赖Redis服务和MySQL服务,如果一段时间之后这两个服务仍未启动,就放弃启动消费者
starttime=$(date +%s) # 开始时间(戳)
maximum=600           # 最多尝试600秒

while true; do
  if [ -e $REDIS_PIDFILE ] && [ -e $MYSQL_PIDFILE ] && [ -e $CONSUMER ]; then
    /usr/bin/nohup $PHP $CONSUMER >/dev/null 2>&1 & # 启动消费者(屏蔽PHP脚本的一切输出)
    break                                           # 退出循环
  else
    diff=$(($(date +%s) - starttime)) # 求当前时间与开始时间的时间差
    if [ $diff -gt $maximum ]; then
      break # 退出循环
    else
      sleep 3
    fi
  fi
done
 
接下来创建service配置文件(其中ExecStart配置项的值就是上面的脚本文件路径)
[root@localhost ~]# chmod +x /shell/MQConsumer.sh # 授权执行
[root@localhost ~]# vim /etc/systemd/system/MQConsumer.service
[Unit]
Description=消息队列消费者服务
After=network.target remote-fs.target
 
[Service]
Type=forking
ExecStart=/shell/MQConsumer.sh
 
[Install]
WantedBy=multi-user.target
[root@localhost ~]# systemctl daemon-reload
 
[root@localhost ~]# systemctl start MQConsumer.service # 启动服务
[root@localhost ~]# systemctl stop MQConsumer.service # 停止服务
[root@localhost ~]# systemctl restart MQConsumer.service # 重启服务
[root@localhost ~]# systemctl status MQConsumer.service # 查看服务运行状态
[root@localhost ~]# systemctl enable MQConsumer.service # 设置开机自启动
[root@localhost ~]# systemctl disable MQConsumer.service # 取消开机自启动

Copyright © 2024 码农人生. All Rights Reserved