linux后台任务在退出终端时被杀死,nohup也不行,最后写了个脚本,crontab定时运行解决

  • Post author:
  • Post category:linux

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的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。不过懒得整了

以上


版权声明:本文为u012140251原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。