需要基本知识
crontab
shell基础
代码
#!/bin/bash
log_path="/home/xxx/xxx.log" #日志路径
mdate=`date +%Y-%m-%d--%H:%M:%S` #日期
count=`ps -ef | grep xxx.py | grep -v "grep" | wc -l` #检测xxx.py这个进程
echo "$count"
if [ $count -eq 0 ]; then #返回0代表无此进程
echo "xxx Error" $mdate >> $log_path
source activate tensorflow #激活TensorFlow环境
cd /home/xxx
nohup python xxx.py #运行xxx.py这个程序
echo "xxx restart" $mdate >> $log_path #日志
else
echo "xxx OK" $mdate >> $log_path #日志
fi
#!/bin/bash
log_path="/home/xxx/xxx.log" #日志路径
mdate=`date +%Y-%m-%d--%H:%M:%S` #日期
#请求服务,看服务是否在线
status_code=$(curl -s -o /dev/null -w %{http_code} http://localhost:8008/encode -H 'content-type:application/json' -d '{"id": 1,"texts": ["测试数据"], "is_tokenized": false}' -X POST)
echo $status_code
if [ $status_code -ne 200 ]; then
echo "xxx Error" $mdate >> $log_path
source activate tensorflow
cd /home/xxx
bash run.sh #自己所写脚本
echo "xxx restart" $mdate >> $log_path
else
echo "xxx OK" $mdate >> $log_path
fi
# 使用curl命令检查http服务器的状态
# -m 设置curl不管访问成功或失败, 最大消耗时间为10秒
# -s设置静默连接,不显示连接时的连接速度、时间消耗等信息
# -o将curl下载的页面内容导出到/dev/null(默认会在屏幕显示返回内容)
# -w设置curl命令需要显示的内容%{http_code},指定curl返回服务器的状态码
将上述文件存为shell文件,例 xx.sh
在crontab中添加xx.sh 并设置电视运行
*/20 * * * * /home/xx.sh 此xx.sh文件在home下,需要写路径;每20分钟执行一次xx.sh
问题
1.运行xx.sh文件遇到permission denied
查看文件权限,需要将程序权限修改 chmod -X xx.sh
2.上述问题没有解决或出现,syntax error: unexpected end of file
查看文件编码,用vim进入后,输入
:set ff
查看是否为unix,否则转换为unix
:set ff=unix
3.source activate 无法进入虚拟环境
一般为环境变量配置问题,找到activate位置然后加入activate路径
whereis activate 或 which activate
/data/anaconda3/bin/activate
source /data/anaconda3/bin/activate tensorflow #上述代码替换为
参考
crontab是用来定期执行程序的命令
-l 列出目前的时程表
-e 执行文字编辑器来设定时程表
查看crontab日志 可以查看不能运行的问题
CentOS: tail -f /var/log/cron
Ubuntu: tail -f /var/log/cron.log
注:Ubuntu 默认没有开启cron log
在w/etc/rsyslog.d/50-default.conf文件中取消#cron.* /var/log/cron.log注释符号#, 并重启rsyslog sudo service rsyslog restart
日期格式
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
例
* * * * * /bin/ls 每一分钟执行一次 /bin/ls
0 6-12/3 * 12 * /usr/bin/backup 在 12 月内, 每天的早上 6 点到 12 点,每隔 3 个小时 0 分钟执行一次 /usr/bin/backup
50 7 * * * /sbin/service sshd start 意思是每天7:50开启ssh服务
*/20 * * * * /data/auto_run.sh 每20分钟执行一次auto_run.sh
参考程序
#!/bin/bash
sec=6
name=Your_thread_name
Thread=`ps -ef | grep $name | grep -v "grep"`
while [ 1 ]
do
count=`ps -ef | grep $name | grep -v "grep" | wc -l`
echo "Thread count: $count"
if [ $count -gt 0 ]; then
echo "The thread is still alive!"
sleep $sec
else
echo "Starting process..."
cd Your_directory/
gnome-terminal -x bash -c "./$name;exec bash;"
sleep 2
echo "Poocess has started!"
fi
done
原理是不断后台检测你的程序有没有在跑,在跑就过几秒再次检测,没在跑马上运行程序
reference
https://www.runoob.com/linux/linux-comm-crontab.html
https://www.dazhuanlan.com/2019/12/19/5dfb1e843484c/
https://blog.csdn.net/baidu_38634017/article/details/108993824