如何在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 = always
和RestartSec = 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