环境 CentOS 6.6
提及的内容:Shell脚本;进程检查(pgrep);定时任务(crontab)
Step 1 编写Shell脚本
这个脚本执行以下任务——检查特定名字的进程是否在运行,如果没有运行则执行启动命令并输出一行记录到日志,如果进程正在运行则什么都不做。
创建脚本(放在哪里其实都可以,这里就跟应用放在一起了)
cd /etc/shadowsocks
touch listen.sh
vi listen.sh
创建完毕,进入vi编辑脚本内容
#!/bin/bash
pgrep shadowsocks &> /dev/null #pgrep是读取进程名为输入内容的进程号,返回到下面,&>输入到空文件
if [ $? -gt 0 ]; #$?代表上面的返回值(进程ID,当且仅当存在这个进程时才会高于0) -gt是大于号
then
echo "`date` restart" >> /var/log/sslisten.log #`date`是当前时间,>>输出到log文件中作为新的一行,log文件也可以与脚本放在同一个目录下
/etc/init.d/shadowsocks start #进程启动命令
#调试阶段此处可以加入返回running状态的内容,去掉井号即可
#else
#echo "`date` restart"
fi
完成后保存并退出,开始测试运行,首先给脚本赋予权限
sudo -s chmod 777 listen.sh
接着测试运行
./listen.sh
如果测试前进程已经运行,那么可以用kill -9杀掉再运行两次,并检查log文件。确认脚本工作正常后可以进行下一步了。
Step2 开启定时任务
crontab是一个周期性任务时间表,可以定时或按给定间隔时间运行特定脚本与任务。
编辑crontab表
crontab -e
进入vi,在文件最后插入
MAILTO=""
*/1 * * * * /etc/shadowsocks/listen.sh
(注意空格)
MAILTO="" 用于关闭发送邮件,否则返回值会做成邮件发送给本机,删掉本行后即可收取返回值
crontab每一行的结构如下
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
而*/1代表的是“每隔多久”执行一次,上文的含义就是每隔1分钟执行一次/etc/shadowsocks/listen.sh脚本
保存退出,接着重启crond服务
service crond restart
等几分钟,杀进程后再看看日志情况。
Step 3 扩展内容
进程启动命令的返回值会被弄成mail自动发到mail目录下,日积月累可能会很恐怖,如果是单一用途设备,可以关掉mail。这个的问题是每次重启都要重新关,比较麻烦
service sendmail stop
不想关的也可以在脚本的进程运行命令后面加上>> /var/log/sslisten.log 合并记录在日志里
注释掉的#else内容有时也很有用,可以选择开启并记录日志,不过自行考虑这会产生多少数据。
参考
Ubuntu Linux下定时监测MySQL进程终止时自动重启的方法 https://cuiqingcai.com/1981.html
环境Ubuntu,本文基本上就源自该内容
CentOS shell脚本 https://blog.csdn.net/TynMhxx/article/details/78879548
crontab https://www.cnblogs.com/clphp/p/6801608.html