为什么我的命名管道输入命令行在调用时会挂起?

时间:2017-02-12 20:50:28

标签: linux shell unix pipe named-pipes

为什么我的命名管道输入命令行在调用时会挂起?

根据答案:

  1. Writing to stdin of background process
  2. Accessing bash command line args $@ vs $*
  3. Send command to a background process
  4. Can I redirect output to a log file and background a process at the same time?
  5. 我写了两个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
    

1 个答案:

答案 0 :(得分:2)

最好直接从管道中读取hlds_run,而不是让cat将其输入。

尝试

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

而不是

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