为什么我的命名管道输入命令行只是挂起时,它被称为?(Why my named pipe input

2019-09-27 11:31发布

为什么我的命名管道输入命令行只是挂起时,它被称为?

基于问题的答案:

  1. 写后台进程的标准输入
  2. 访问bash命令行参数$ @ $ VS *
  3. 发送命令到后台进程
  4. 我可以将输出重定向到一个日志文件和后台进程在同一时间?

我写了两个shell脚本与我的游戏服务器进行通信。 而工作的第一次,我做到了。 既然他们,他们不工作了。 每次我做./send.sh commands在命令行中挂起,直到我打了Ctrl+C

它也挂起,什么也不做,当我直接echo commamd > /tmp/srv-input


脚本

它启动服务器,并配置它来读取/接收我的命令,而它在后台运行:

start_czero_server.sh

#!/bin/sh

# Go to the game server application folder where the game application `hlds_run` is
cd /home/user/Half-Life
pkill -f hlds

# Set up a pipe named `/tmp/srv-input`
rm /tmp/srv-input
mkfifo /tmp/srv-input

cat > /tmp/srv-input &
echo $! > /tmp/srv-input-cat-pid

# Start the server reading from the pipe named `/tmp/srv-input`
# And also output all its console to the file `/home/user/Half-Life/my_logs.txt`
cat /tmp/srv-input | ./hlds_run -console -game czero +port 27015 > my_logs.txt 2>&1 &

# Successful execution 
exit 0

这第二个脚本,它只是一个包装这让我轻松地发送到我的服务器的命令:

send.sh

#!/bin/sh
echo "$@" > /tmp/srv-input

# Successful execution 
exit 0

现在每次我要发送一个命令到我的服务器我只是做终端上:

./send.sh mp_timelimit 30

我总是把另一个打开终端打开刚才听我的服务器服务器控制台。 要做到这一点只需要使用tail命令与-f标志跟随我的服务器控制台输出:

./tail -f /home/user/Half-Life/my_logs.txt

Answer 1:

你会关闭只是有更好的hlds_run直接从管道中读取,而不必cat在管吧。

尝试

./hlds_run … > my_logs.txt 2>&1 < /tmp/srv-input &

代替

cat /tmp/srv-input | ./hlds_run …


文章来源: Why my named pipe input command line just hangs when it is called?