11

摘要:如何在后台运行交互式任务?

详细信息:我试图在 ash shell (Busybox) 下运行这个简单的脚本作为后台任务。

我的脚本.sh&

但是脚本立即停止...

[1]+ 停止(tty 输入)myscript.sh

myscript.sh 内容...(仅相关部分,除此之外我捕获 SIGINT、SIGHUP 等)

#!/bin/sh

catpid=0

START_COPY()
{
  cat /dev/charfile > /path/outfile &
  catpid = $! 
}

STOP_COPY()
{
  kill catpid 
}

netcat SOME_IP PORT | while read EVENT
do
  case $EVENT in
    start) START_COPY;;
    stop) STOP_COPY;;
  esac
done

通过简单的命令行测试,我发现 bot cat 和 netcat 尝试从 tty 读取。请注意,此 netcat 版本没有 -e 来抑制 tty。

现在可以做些什么来避免 myscript 停止?

我尝试过的事情没有任何成功:

1) netcat/cat ... < /dev/tty (或 的输出tty

2) 使用 () 在子 shell 中运行包含 cat 和 netcat 的块。这可能有效,但是如何获取猫的 PID?

交给各位专家...


问题依然存在。一个简单的测试供大家尝试:

1) 在一个终端运行 netcat -l -p 11111 (不带 &)

2)在另一个终端运行 netcat localhost 11111 & (这应该会在一段时间后停止并显示消息 Stopped (TTY input) )

如何避免这种情况?

4

6 回答 6

14

你可能想要netcat's "-d" option,它告诉它不要从STDIN.

于 2012-07-19T16:39:16.110 回答
9

我可以确认这-d将有助于 netcat 在后台运行。

我看到了同样的问题:

nc -ulk 60001 | nc -lk 60002 &

每次我查询jobs,管道输入都会停止。

将命令更改为以下修复它:

nc -ulkd 60001 | nc -lk 60002 &
于 2013-06-19T06:04:24.203 回答
4

你确定你是按原样给出你的脚本还是你只是输入了一个粗略的传真来说明一般的想法?您问题中的脚本有很多错误,应该会阻止它正确运行,这让我感到奇怪。

  1. =in周围的空格catpid=$!使该行不是有效的变量赋值。如果那是在您的原始脚本中,我很惊讶您没有收到任何错误。

  2. kill catpid行应该失败,因为字面词catpid不是有效的作业 ID。你可能想要kill "$catpid".

至于你的实际问题:

  • cat应该/dev/charfile从标准输入而不是从标准输入或其他任何地方读取。您确定它正在尝试读取 tty 输入吗?

  • 如果您不需要阅读任何内容,您是否尝试过重定向netcat的输入?netcat < /dev/nullnetcat

于 2011-08-12T16:16:17.383 回答
1

我必须使用没有 -d 选项的 netcat。

"echo -n | netcat ... &" 似乎是一种有效的解决方法:即如果您不需要使用它,请立即关闭 netcat 的标准输入。

于 2013-11-19T10:33:56.817 回答
0

由于尚未真正回答,如果使用 Busybox 和 -d 选项不可用,以下命令将在发送到后台时保持 netcat “活动”:

tail -f /dev/null | netcat ...

netcat < /dev/nullecho -n | netcat没有为我工作。

于 2016-02-24T08:51:58.207 回答
0

组合screendisown-ing 过程对我有用,因为“-d”选项对 netcat 不再有效。尝试重定向,nc </dev/null但会话过早结束(因为我需要 -q 1 以确保 nc 进程在文件传输完成时停止)

首先设置接收端,

在接收端,屏幕为 netcat 保留标准输入,因此它不会终止

编辑:我错了,你需要输入命令 INSIDE screenscreen如果您重定向命令nc内联,则在附加到时,您将没有保存文件,或者终端中出现奇怪的二进制内容screenscreen nc -l -p <listen port> -q 1 > /path/to/yourfile.bin(例如,这是错误的方式:)

  1. 打开screen,然后按return/Enter欢迎消息。将出现新的空白外壳(您现在在屏幕内)
  2. 键入命令: nc -l -p 1234 > /path/to/yourfile.bin

  3. 然后,按CTRL+ a,然后按d分离屏幕。

在 Sender 端,disown 进程,到达 EOF 后 1 秒退出

cat /path/to/yourfile.bin | nc -q1 100.10.10.10 1234 & disown
于 2020-01-01T06:11:07.390 回答