linux后台任务在退出终端时被杀死,nohup也不行,最后写了个脚本,crontab定时运行解决
起因
在服务器上起了个后台任务,结果在退出终端的时候被杀死了,用nohup也不行,明明前几天还是好的,在网上搜了好久,尝试了各种办法,包括screen均不行,实在没辙,只能自己写了个脚本,定时执行,把程序拉起来。
服务器版本: centos7
1、目标程序
用golang起一个最简单的web服务,监听端口9090,访问时会在页面打印出程序员必备的hello world,程序路径:/root/web
2、写一个简单的启动目标程序的shell脚本
新建一个shell脚本:vim test.sh
#!/bin/bash
echo "定时任务开启了"
webport=$(lsof -i:9090)
if [ ! -n "$webport" ]; then
echo "====web test now restart===="
cd ~
./web &
else
echo "WEB TEST IS NOT NULL"
fi
简单解释一下:
第一行是shell脚本用bash执行,
第三行是将 lsof -i:9090 返回的结果赋值给变量webport,
第四行及以后的 if 判断webport的值是否为空,也就是说9090端口有没有被占用,如果有被占用则证明程序在运行,如果为空则到家目录下,将web后台启动(此处也可以换成nohup)。
3、创建crontab定时任务
vim /etc/crontab
将这句加到后面,
*/1 * * * * root /root/test.sh > /root/test.txt
一个“>”是覆盖写入,两个“>>”是追加写入,依实际情况而定
第一个*/1代表每隔1分钟执行一次,
每个星号分别代表了 秒、分、时、日、月、周 ,这些网上都很多,照着做就好。
检查定时任务有没有开启
service crond status
用以下的方法启动、关闭这个cron服务:
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
PS:如果脚本能手动运行成功,而定时运行失败,多半是脚本里还要加环境变量,如下
source /etc/profile
. ~/.bash_profile
#!/bin/bash
echo "定时任务开启了"
webport=$(lsof -i:9090)
if [ ! -n "$webport" ]; then
echo "====web test now restart===="
cd ~
./web &
else
echo "WEB TEST IS NOT NULL"
fi
在shell脚本的最开头,加上
source /etc/profile
. ~/.bash_profile
将环境变量预加载进去。
后记
这个解决办法只是个无奈之举,可以先凑合着用,有时间还是要把服务器不能后台运行的问题找出来。还有个叫supervisor的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。不过懒得整了
以上