如何让启动程序后的Cron任务自动退出?
如何让启动程序后的Cron任务自动退出?
兄弟,我懂你遇到的糟心事——明明给qbittools加了&让它后台运行,但cron任务就是赖着不退出,时间久了一堆任务堆积,看着都头疼对吧?
其实问题出在进程的输出和会话关联上:你虽然把程序放后台了,但它的标准输出/错误还和cron的会话绑在一起,cron会一直等着这些输出,导致你的脚本进程没法彻底结束。
给你两个靠谱的解决办法,直接改脚本就行:
方法一:用disown彻底脱离会话
修改脚本里的else分支,加上输出重定向和disown:
#!/bin/bash if pgrep -x "qbittools" > /dev/null then echo "Running" else # 把所有输出扔去/dev/null,同时后台运行,再用disown切断关联 qbittools reannounce -s 192.168.1.77:10095 -U xxxx -P xxxx > /dev/null 2>&1 & disown fi exit 0
这里几个关键点:
> /dev/null 2>&1:把程序的标准输出和错误输出都丢弃,避免cron因为等待输出而挂住脚本&:让程序在后台运行disown:告诉bash不要把这个后台进程当成自己的子进程,这样脚本退出时不会影响qbittools,同时脚本能顺利结束
方法二:用nohup(更稳妥的老方法)
如果你觉得disown不够直观,也可以用nohup,它专门用来让进程脱离终端会话运行:
#!/bin/bash if pgrep -x "qbittools" > /dev/null then echo "Running" else nohup qbittools reannounce -s 192.168.1.77:10095 -U xxxx -P xxxx > /dev/null 2>&1 & fi exit 0
nohup默认会生成nohup.out日志文件,所以我们加上> /dev/null 2>&1把它关掉,避免生成无用文件。
验证方法
改完脚本后,你可以手动运行一次,然后用ps aux | grep 你的脚本名看看,脚本进程应该很快就消失了,同时用pgrep qbittools能查到qbittools在正常运行,这样cron就不会堆积任务了。
备注:内容来源于stack exchange,提问作者cmplieger
相关产品推荐
相关产品推荐

