在后台shell脚本中使用netcat / cat(如何避免停止(tty输入)?)

问题描述 投票:8回答:6

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

详细信息:我正在尝试在ash shell(Busybox)下运行此简单脚本作为后台任务。

myscript.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)使用()在子外壳中运行包含cat和netcat的块。这可能有效,但是然后如何获取cat的PID?

交给您的专家...


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

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

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

如何避免这种情况?

shell input background tty netcat
6个回答
11
投票

您可能想要netcat's "-d" option,它告诉它不要从STDIN中读取。


6
投票

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

我在遇到相同的问题:

nc -ulk 60001 | nc -lk 60002 &

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

将命令更改为以下内容进行了修复:

nc -ulkd 60001 | nc -lk 60002 &

4
投票

您确定已按原样提供了脚本,还是只是键入了一个粗略的传真来说明总体思路?您问题中的脚本有很多错误,应该会阻止它正常运行,这让我感到奇怪。

  1. =catpid=$!周围的空格使该行无效。如果那是您的原始脚本中的内容,我很惊讶您没有收到任何错误。

  2. kill catpid行应该失败,因为文字catpid不是有效的作业ID。您可能需要kill "$catpid"

关于您的实际问题:

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

  • [如果您不需要netcat来读取任何内容,是否尝试过重定向netcat < /dev/null的输入,例如netcat


1
投票

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

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


0
投票

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

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

[netcat < /dev/nullecho -n | netcat对我不起作用。


0
投票

screendisown合并处理对我有用,因为'-d'选项对netcat不再有效。尝试过像nc </dev/null这样的重定向,但是会话过早结束(因为我需要-q 1以确保在文件传输完成后nc进程停止)

[首先设置接收方,

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

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

  1. 打开screen,然后在欢迎消息上按return/Enter。将会出现新的空白外壳(您现在在屏幕内)
  2. 类型命令 nc -l -p <listen port> -q 1 > /path/to/yourfile.bin
  3. 然后按CTRL + a,然后按d以分离屏幕。

在发送方,拒绝过程

cat </path/to/yourfile.bin> | nc <recv ip/hostname> <port> & disown
© www.soinside.com 2019 - 2024. All rights reserved.