我正在尝试每 10 分钟检查一次我的某个进程是否正在运行,如果没有,请重新启动该进程。我希望这个脚本在系统启动时自动启动,所以我选择了Linux 中的服务。
所以这就是我所做的:
- 编写了一个 Bash 脚本作为服务。
- 在
start
shell脚本的方法中,在无限while循环中,检查是否存在临时文件。如果可用,请执行我的逻辑,否则请打破循环。 - 在该
stop
方法中,删除临时文件。 - 然后我使用 update-rc.d 将此脚本添加到系统启动。
一切都很好,除了一件事。如果我这样做./myservice start
了,那么终端就会挂起(它应该在运行一个无限循环),但是如果我这样做,ctrl-z
那么脚本将被终止并且我的任务将不会执行。如何使此脚本从终端启动并正常执行?(比如,说,./etc/init.d/mysql start
)。也许在后台执行该过程并返回。
我的 Bash 脚本如下:
#!/bin/bash
# Start the service
start() {
#Process name that need to be monitored
process_name="mysqld"
#Restart command for process
restart_process_command="service mysql start"
#path to pgrep command
PGREP="/usr/bin/pgrep"
#Initially, on startup do create a testfile to indicate that the process
#need to be monitored. If you dont want the process to be monitored, then
#delete this file or stop this service
touch /tmp/testfile
while true;
do
if [ ! -f /tmp/testfile ]; then
break
fi
$PGREP ${process_name}
if [ $? -ne 0 ] # if <process> not running
then
# restart <process>
$restart_process_command
fi
#Change the time for monitoring process here (in secs)
sleep 1000
done
}
stop() {
echo "Stopping the service"
rm -rf /tmp/testfile
}
### main logic ###
case "$1" in
start)
start
;;
stop)
stop
;;
status)
;;
restart|reload|condrestart)
stop
start
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac
exit 0