在Linux下监视进程,当该进程崩溃挂掉后自动重启,可以通过编写shell脚本来实现。下面是完整的攻略:
1.编写监视脚本
首先,我们需要编写一个监视脚本,命名为monitor.sh。该脚本会定期检测目标进程是否在运行,并在进程崩溃时自动重新启动它。
1.1 判断进程是否运行
在Shell脚本内,可以通过命令ps
来查找正在运行的进程。我们可以使用grep
和正则表达式来查找进程的名称。
#!/bin/bash
PROCESS_NAME="target_process"
# 使用pgrep命令来查找进程id
PROCESS_ID=$(pgrep "${PROCESS_NAME}")
if [ "${PROCESS_ID}" = "" ]; then
echo "Process ${PROCESS_NAME} is not running. Starting it..."
/path/to/start_target_process.sh
fi
上面的代码中,${PROCESS_NAME}
是我们需要监视的进程的名称。如果pgrep
命令找不到该进程,就说明该进程没有在运行。此时,我们输出简短的信息,并调用启动进程的脚本。
1.2 重启进程
如果目标进程崩溃了,那么我们需要立即重启它,避免人工干预。在Shell脚本中,可以使用kill
命令来停止进程,并使用启动脚本再次启动它。
#!/bin/bash
PROCESS_NAME="target_process"
# 使用pgrep命令来查找进程id
PROCESS_ID=$(pgrep "${PROCESS_NAME}")
if [ "${PROCESS_ID}" = "" ]; then
echo "Process ${PROCESS_NAME} is not running. Starting it..."
/path/to/start_target_process.sh
else
echo "Process ${PROCESS_NAME} is running. Checking if it's healthy..."
# 检测进程是否正常运行
RESULT=$(kill -0 "${PROCESS_ID}" 2>&1)
if [[ "${RESULT}" =~ "No such process" ]]; then
echo "Process ${PROCESS_NAME} is not running. Restarting it..."
# 结束进程
kill -9 "${PROCESS_ID}"
# 启动进程
/path/to/start_target_process.sh
else
echo "Process ${PROCESS_NAME} is running normally."
fi
fi
上述代码中,我们首先检查进程是否在运行。如果它正在运行,我们尝试结束它,并且使用启动脚本再次运行它。否则,我们仍然使用启动脚本来启动进程。
2.设置定时任务
接下来,我们需要设置定时任务,使监视脚本可以在后台运行,并且在目标进程挂掉后可以自动重启。
我们可以使用Linux内置的定时任务工具crontab
来完成这个任务。在命令行中键入crontab -e
可以打开编辑器。然后输入以下的一行代码:
* * * * * /path/to/monitor.sh >>/path/to/logfile.log 2>&1
上述代码中,* * * * *
表示每分钟都会执行该脚本。/path/to/monitor.sh
是监视脚本的路径。>>/path/to/logfile.log 2>&1
这部分则是将监视脚本的输出重定向到日志文件/path/to/logfile.log
中。
3.示例
示例一
在这个示例中,我们需要监控MySQL进程是否在运行,同时当MySQL进程挂掉后自动重启。
我们可以编写一个名为monitor_mysql.sh
的Shell脚本,将以下代码放在其中:
#!/bin/bash
PROCESS_NAME="mysqld"
# 使用pgrep命令来查找进程id
PROCESS_ID=$(pgrep "${PROCESS_NAME}")
if [ "${PROCESS_ID}" = "" ]; then
echo "MySQL is not running. Starting it..."
/etc/init.d/mysql start
else
echo "MySQL is running. Checking if it's healthy..."
# 检测进程是否正常运行
RESULT=$(kill -0 "${PROCESS_ID}" 2>&1)
if [[ "${RESULT}" =~ "No such process" ]]; then
echo "MySQL is not running. Restarting it..."
# 结束进程
kill -9 "${PROCESS_ID}"
# 启动进程
/etc/init.d/mysql start
else
echo "MySQL is running normally."
fi
fi
上述代码中,我们监控MySQL进程是否在运行,如果它没有在运行,那么我们调用启动脚本来启动它。如果MySQL进程停止了,我们会停止这个进程并启动一个新的MySQL进程。
接下来,我们需要将该监视脚本设置为定时任务。执行以下命令可以将monitor_mysql.sh
作为每分钟执行的任务添加到Cron中:
$ crontab -e
* * * * * /path/to/monitor_mysql.sh >>/path/to/logfile.log 2>&1
示例二
在这个示例中,我们需要监控Nginx进程是否在运行,以及当Nginx进程挂掉后自动重启。
我们可以编写名为monitor_nginx.sh
的Shell脚本,将以下代码放在其中:
#!/bin/bash
PROCESS_NAME="nginx"
# 使用pgrep命令来查找进程id
PROCESS_ID=$(pgrep "${PROCESS_NAME}")
if [ "${PROCESS_ID}" = "" ]; then
echo "Nginx is not running. Starting it..."
/etc/init.d/nginx start
else
echo "Nginx is running. Checking if it's healthy..."
# 检测进程是否正常运行
RESULT=$(kill -0 "${PROCESS_ID}" 2>&1)
if [[ "${RESULT}" =~ "No such process" ]]; then
echo "Nginx is not running. Restarting it..."
# 结束进程
kill -9 "${PROCESS_ID}"
# 启动进程
/etc/init.d/nginx start
else
echo "Nginx is running normally."
fi
fi
上述代码中,我们首先监控Nginx进程是否在运行。如果进程没有运行,我们调用启动脚本来启动它。如果Nginx进程已经停止,我们将停止这个进程并启动一个新的Nginx进程。
最后,我们需要将该监视脚本设置为定时任务,以便在Nginx进程崩溃时自动重启。执行以下命令可以将monitor_nginx.sh
作为每分钟执行一次的任务添加到Cron中:
$ crontab -e
* * * * * /path/to/monitor_nginx.sh >>/path/to/logfile.log 2>&1
以上就是实现在linux下监视进程崩溃挂掉后自动重启的shell脚本的完整攻略,以及两条示例说明。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:linux下监视进程 崩溃挂掉后自动重启的shell脚本 - Python技术站