如何在后台运行脚本(linux openwrt)?

时间:2014-12-24 09:37:07

标签: linux shell ash

我有这个脚本:

#!/bin/sh
while [ true ] ; do
    urlfile=$( ls /root/wget/wget-download-link.txt | head -n 1 )
    dir=$( cat /root/wget/wget-dir.txt )
    if [ "$urlfile" = "" ] ; then
        sleep 30
        continue
    fi

    url=$( head -n 1 $urlfile )
    if [ "$url" = "" ] ; then
        mv $urlfile $urlfile.invalid
        continue
    fi

    mv $urlfile $urlfile.busy
    wget -b $url -P $dir -o /www/wget.log -c -t 100 -nc
    mv $urlfile.busy $urlfile.done
done

该脚本基本上会每隔30秒检查wget-download-link.txt处的新网址,如果有新网址,则会使用wget下载该网址,问题是当我尝试运行此网址时Putty上的脚本就像这样

/root/wget/wget_download.sh --daemon
它仍然在前台运行,我仍然可以看到终端输出。如何让它在后台运行?

8 个答案:

答案 0 :(得分:6)

在OpenWRT中,默认情况下既没有nohup也没有screen,所以只有内置命令的解决方案是使用括号启动子shell并将其放在后台{{1} }:

&

您可以在桌面上轻松测试此结构,例如

(/root/wget/wget_download.sh >/dev/null 2>&1 )&

...然后在这15秒结束之前关闭你的控制台,你会看到关闭控制台后括号中的命令继续执行。

答案 1 :(得分:2)

以下命令也可以使用:

((/root/wget/wget_download.sh)&)&

这样您就不必在用于OpenWrt的路由器的紧密内存空间中安装'nohub'命令。

几年前我在某个地方找到了这个。它有效。

答案 2 :(得分:0)

您可以使用nohup

nohup yourscript.sh

nohup yourscript.sh &

即使您关闭了putty会话,您的脚本也会继续运行,并且所有输出都将写入同一目录中的文本文件。

nohup通常与nice命令结合使用,以较低优先级运行进程。

nohup nice yourscript.sh &

请参阅:http://en.wikipedia.org/wiki/Nohup

答案 3 :(得分:0)

脚本末尾的&应该足够了,如果你看到脚本的输出意味着,stdout和/或stderr没有关闭,或者没有重定向到/dev/null

你可以使用这个答案:

How to redirect all output to /dev/null

答案 4 :(得分:0)

我正在使用openwrt merlin,使其正常工作的唯一方法是使用crud cron manager [1]。 Nohub和屏幕无法用作解决方案。

  

按下pinggw“ 0 * * * * / bin / ping -c 10 -q 192.168.2.254”

像魅力一样工作

[1] [https://www.cyberciti.biz/faq/how-to-add-cron-job-on-asuswrt-merlin-wifi-router/]

答案 5 :(得分:0)

https://openwrt.org/packages/pkgdata/coreutils-nohup

opkg update
opkg install coreutils-nohup
nohup yourscript.sh &

答案 6 :(得分:0)

对于Openwrt Merlin系统中的busybox,我有一个结合了cru和date命令的更好的解决方案

cru a YOUR_UNIQUE_CRON_NAME "`date -D '%s' +'%M %H %d %m *' -d $(( \`date +%s\`+2*60 ))` YOUR_CMD_HERE"

其中添加了2分钟后运行的cron作业,并且只能运行一次。

受到PlagTag想法的启发。

答案 7 :(得分:-4)

试试这个:

 nohup /root/wget/wget_download.sh >/dev/null 2>&1 &

它将进入后台,因此当您关闭Putty会话时,它仍将继续运行,并且不会向终端发送消息。