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

Lov*_*rus 8 shell background input tty netcat

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

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

myscript.sh&

然而脚本立即停止......

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

myscript.sh内容......(只有relvant部分,其他我捕获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
Run Code Online (Sandbox Code Playgroud)

从简单的命令行测试我发现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输入)消息)

怎么避免这个?

小智 11

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


小智 6

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

我看到同样的问题:

nc -ulk 60001 | nc -lk 60002 &
Run Code Online (Sandbox Code Playgroud)

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

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

nc -ulkd 60001 | nc -lk 60002 &
Run Code Online (Sandbox Code Playgroud)


jw0*_*013 4

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

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

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

至于你的实际问题:

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

  • 您是否尝试过重定向输入,netcat就像netcat < /dev/null您不需要netcat阅读任何内容一样?