如何在Linux/Unix上从crontab中重启进程

时间:2020-01-09 10:39:37  来源:igfitidea点击:

如果在Linux或类似Unix的系统上进程未运行,如何使用cron作业重新启动它?
有很多方法可以确保基本服务器进程(例如HTTPD/Nginx/PHP-FPM/MySQL)始终保持正常运行。

本教程介绍了如何使用crontab创建和使用简单的bash shell脚本重新启动失败的服务。

第1步创建一个Bash Shell脚本

这是一个简单的shell脚本,可使用pgrep命令检查httpd pid。
如果httpd没有在CentOS/RHEL上使用systemctl命令运行,它将重新启动。
创建一个名为/root/bin/restart-httpd的文件

# vi /root/bin/restart-httpd

追加以下代码:

#!/bin/bash
# Apache Process Monitor
# Restart Apache Web Server When It Goes Down
#  RHEL / CentOS 7.x httpd restart command
RESTART="/bin/systemctl restart httpd"
 
#Path to pgrep command
PGREP="/usr/bin/pgrep"
 
# Httpd daemon name: Under RHEL/CentOS/Fedora it is httpd
HTTPD="httpd"
 
# Find httpd pid
$PGREP ${HTTPD}
 
if [ $? -ne 0 ] # if apache not running 
then
# restart apache
$RESTART
fi

保存并关闭文件。
设置权限:

# chmod +x /root/bin/restart-httpd
# /root/bin/restart-httpd

步骤2设置cron作业以重新启动进程

Cron允许Linux和Unix用户在给定的日期和时间运行命令或脚本。
您可以安排脚本定期执行。
执行以下命令:

# crontab -e

追加以下代码以重新启动httpd

## restart httpd if not running. check for httpd every 5 mins
*/5 * * * * /root/bin/restart-httpd >/dev/null 2>&1

保存并关闭文件。

关于Linux和基于systemd的系统的说明

Systemd可以为您保持服务的活力。
您需要使用cp命令:

# cp /lib/systemd/system/httpd.service /etc/systemd/system/httpd.service

使用vi命令编辑文件:

# vi /etc/systemd/system/httpd.service

在[Service]部分中添加Restart = alwaysRestartSec = 5,如下所示:

[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
 
[Service]
##############################################
## Make sure httpd always restart if failed ##
## Configures the time to sleep before      ##    
## restarting a service with 5 seconds too  ##
##############################################
Restart=always
RestartSec=5
##############################################
Type=notify
EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND
ExecReload=/usr/sbin/httpd $OPTIONS -k graceful
ExecStop=/bin/kill -WINCH ${MAINPID}
# We want systemd to give httpd some time to finish gracefully, but still want
# it to kill httpd after TimeoutStopSec if something went wrong during the
# graceful stop. Normally, Systemd sends SIGTERM signal right after the
# ExecStop, which would kill httpd. We are sending useless SIGCONT here to give
# httpd time to finish.
KillSignal=SIGCONT
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target

重新加载配置:

# systemctl daemon-reload
# systemctl restart httpd

通过使用kill命令杀死httpd来测试它:

# kill -9 $(pgrep httpd)

5秒钟后,httpd将再次重新启动。
使用ps命令验证:

# ps aux | grep httpd

输出示例:

root      8052  0.0  0.0 221960  7580 ?        Ss   13:46   0:00 /usr/sbin/httpd -DFOREGROUND
apache    8053  0.0  0.0 221960  6096 ?        S    13:46   0:00 /usr/sbin/httpd -DFOREGROUND
apache    8054  0.0  0.0 221960  6096 ?        S    13:46   0:00 /usr/sbin/httpd -DFOREGROUND
apache    8055  0.0  0.0 221960  6096 ?        S    13:46   0:00 /usr/sbin/httpd -DFOREGROUND
apache    8056  0.0  0.0 221960  6096 ?        S    13:46   0:00 /usr/sbin/httpd -DFOREGROUND
apache    8057  0.0  0.0 221960  6096 ?        S    13:46   0:00 /usr/sbin/httpd -DFOREGROUND
root      8061  0.0  0.0 112644  1720 ?        S+   13:46   0:00 grep --color=auto httpd