诉求

在服务器上跑了一个服务,需要24小时不间断运行。
如果你是root或所在用户已加入sudoer那么参考Linux添加自启动daemon service 若所在用户没有root权限无法向系统写入service实现daemon接着往下看

分析

普通用户仍然具有创建计划任务的权限
可以通过crontab设置每分钟运行脚本检查进程是否存活

实现

首先创建守护脚本

$ vi ~/crash_monitor.sh

#!/bin/bash
if test $(pgrep gogs|wc -l) -eq 0
then
nohup /home/git/gogs/gogs web > /dev/null 2>&1 &
fi

# 保存退出并赋予执行权限
$ chmod +x ~/crash_monitor.sh

上述脚本将检查是否存在gogs进程,不存在则后台执行gogs
有关nohup可以参考之前的文章同为后台运行screen, nohup和start-stop-daemon到底有什么区别? 接着添加crontab计划任务

$ crontab -e

# 末尾加入以下内容
* * * * * /home/git/crash_monitor.sh

上述配置代表每分钟执行一次

拓展

crontab语法详解,前五位分别为时间参数

*    *    *    *    *
-    -    -    -    -
|    |    |    |    |
|    |    |    |    +----- 星期中星期几 (0 - 7) (星期天为0或7)
|    |    |    +---------- 月份 (1 - 12) 
|    |    +--------------- 一个月中的第几天 (1 - 31)
|    +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)

第六位至行尾均视为命令,举例:

# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# m h dom mon dow command
0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

综上crontab支持的最高任务频率为每分钟一次
当然也可以通过奇技淫巧实现更高频率,例如:

# Run your command every 10sec
* * * * * /home/you/task.sh
* * * * * sleep 10;/home/you/task.sh
* * * * * sleep 20;/home/you/task.sh
* * * * * sleep 30;/home/you/task.sh
* * * * * sleep 40;/home/you/task.sh
* * * * * sleep 50;/home/you/task.sh

注:生产环境不建议这么做,老老实实用daemon service配置重启间隔吧。

参考

unix - How can I schedule a cron job that runs every 10 seconds in linux? - Server Fault