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

hgtggwj0  于 2023-03-13  发布在  Shell
关注(0)|答案(9)|浏览(574)

我有这样的脚本:

#!/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

它仍然在前台运行,我仍然可以看到终端的输出。我怎么让它在后台运行?

ljsrvy3e

ljsrvy3e1#

在OpenWRT(2023年之前)中,默认情况下nohupscreen都不可用,所以只有内置命令的解决方案是用括号启动一个子shell,然后用&将其放在后台:

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

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

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

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

2hh7jdfx

2hh7jdfx2#

以下命令也将起作用:

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

这样你就不必在OpenWrt所用路由器的紧张内存空间中安装“nohub”命令。
几年前我在什么地方找到的。很管用。

zzlelutf

zzlelutf3#

脚本末尾的&应该足够了,如果您看到脚本的输出,则意味着stdout和/或stderr未关闭,或者未重定向到/dev/null
您可以使用以下答案:
How to redirect all output to /dev/null

qco9c6ql

qco9c6ql4#

我正在使用openwrt merlin,让它工作的唯一方法是使用crud cron管理器[1]。Nohub和screen不可用作解决方案。
搜索一个pinggw“0 * * * * /bin/ping -c 10 -q192.168.2.254“
工作起来很有魅力
[1]https://www.cyberciti.biz/faq/how-to-add-cron-job-on-asuswrt-merlin-wifi-router/(https://www.cyberciti.biz/faq/how-to-add-cron-job-on-asuswrt-merlin-wifi-router/])

htrmnn0y

htrmnn0y5#

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

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

t2a7ltrp6#

您可以使用nohup

nohup yourscript.sh

nohup yourscript.sh &

即使关闭putty会话,脚本也会继续运行,并且所有输出都将写入同一目录下的文本文件。
nohup通常与nice命令结合使用,以运行优先级较低的进程。

nohup nice yourscript.sh &

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

8aqjt8rx

8aqjt8rx7#

针对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的想法。

332nm8kg

332nm8kg8#

在另一种方式下,这些代码将尝试:

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

简单,没有任何程序像nohup屏幕...
(BTW:在华硕-Merlin固件上工作)

huus2vyu

huus2vyu9#

试试这个:

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

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

相关问题