如何在后台运行脚本(Linux OpenWrt)?

8

我有这段脚本:

#!/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中是否有新的URL,如果有新的URL,它将使用wget进行下载。问题在于,当我尝试在Putty上运行这个脚本时,像这样:

/root/wget/wget_download.sh --daemon

程序目前仍在前台运行,终端输出仍可见。我该如何让它在后台运行?


你可以在命令的末尾使用 & 运算符将其在后台运行。 - iqstatic
9个回答

17
在OpenWRT(2023年之前)中,缺省情况下既没有nohup也没有screen,因此只使用内置命令的解决方案是用括号启动子shell,然后用&将其放入后台。
(/root/wget/wget_download.sh >/dev/null 2>&1 )&

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

(notify-send one && sleep 15 && notify-send two)&

... 然后在这 15 秒内关闭控制台,您将会看到方括号中的命令在关闭控制台后继续执行。


1
只是留在这里,现在是2023年,opkg有nohup了:opkg安装coreutils-nohup。 - Aiyion.Prime

2
以下命令同样有效:
((/root/wget/wget_download.sh)&)&

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

我几年前在某个地方发现了这个方法。它可行。


4
为什么需要使用两个“&”? - Allan Ruin
@AllanRuin 没有理由使用两个 & - kirelagin

1
在脚本结尾处加上&就足够了,如果您看到脚本输出,则意味着stdout和/或stderr未关闭或未重定向到/dev/null。您可以使用此答案:

如何将所有输出重定向到/dev/null


1

1

0

你可以使用 nohup

nohup yourscript.sh

或者

nohup yourscript.sh &

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

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

nohup nice yourscript.sh &

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


0

换句话说,这些代码将被尝试:

ssh admin@192.168.1.1 "/jffs/your_script.sh &"

简单而且没有像nohup screen这样的程序...
(顺便说一句:在Asus-Merlin固件上工作)


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"

添加一个cron job,延迟2分钟运行,并且只运行一次。

受PlagTag的想法启发。


-4

试试这个:

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

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


虽然您的进程将在后台启动,但操作员仍将在终端上看到脚本的输出。 - SMA
完整的命令应该是:nohup /root/wget/wget_download.sh >/dev/null 2>&1 & - jcbermu
我第一次写的不对,所以我编辑了一下加上了 /dev/null 2>&1。这是我的错。 - jcbermu
1
被接受的答案应该是(命令)和解决方案。在OpenWrt上没有nohup,请参见:http://bitzof.me/doku.php?id=electronics:wr703n:nohup - bownie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接