将命令发送到后台进程

时间:2011-05-13 21:47:57

标签: bash process

我有一个先前运行的进程(process1.sh),它在后台运行,PID为1111(或其他任意数字)。如何将command option1 option2之类的内容发送到PID为1111的进程?

想要开始新的process1.sh!

6 个答案:

答案 0 :(得分:13)

命名管道是你的朋友。请参阅文章Linux Journal: Using Named Pipes (FIFOs) with Bash

答案 1 :(得分:2)

如果您不希望仅限于信号,则您的程序必须支持其中一种进程间通信方法。请参阅corresponding Wikipedia article

一种简单的方法是让它在Unix domain socket上监听命令。

答案 2 :(得分:2)

答案 3 :(得分:2)

您可以使用bash的coproc命令。 (仅适用于4.0+) - 就像kshs |&

选中此示例http://wiki.bash-hackers.org/syntax/keywords/coproc

答案 4 :(得分:1)

您无法将新参数发送到正在运行的进程。

但是如果你正在实现这个过程或者一个可以从管道中获取args的过程,那么另一个答案会有所帮助。

答案 5 :(得分:1)

根据答案:

  1. Writing to stdin of background process
  2. Accessing bash command line args $@ vs $*
  3. Why my named pipe input command line just hangs when it is called?
  4. Can I redirect output to a log file and background a process at the same time?
  5. 我写了两个shell脚本来与我的游戏服务器通信。

    第一个脚本在计算机启动时运行。它启动服务器并将其配置为在后台运行时读取/接收命令:

    <强> 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
    
    # Set up a pipe named `/tmp/srv-input`
    rm /tmp/srv-input
    mkfifo /tmp/srv-input
    
    # To avoid your server to receive a EOF. At least one process must have
    # the fifo opened in writing so your server does not receive a EOF.
    cat > /tmp/srv-input &
    
    # The PID of this command is saved in the /tmp/srv-input-cat-pid file
    # for latter kill.
    # 
    # To send a EOF to your server, you need to kill the `cat > /tmp/srv-input` process
    # which PID has been saved in the `/tmp/srv-input-cat-pid file`.
    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`
    #
    # Replace the `./hlds_run -console -game czero +port 27015` by your application command
    ./hlds_run -console -game czero +port 27015 > my_logs.txt 2>&1 < /tmp/srv-input &
    
    # Successful execution 
    exit 0
    

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

    <强> send.sh

    half_life_folder="/home/jack/Steam/steamapps/common/Half-Life"
    
    half_life_pid_tail_file_name=my_logs_tail_pid.txt
    half_life_pid_tail="$(cat $half_life_folder/$half_life_pid_tail_file_name)"
    
    if ps -p $half_life_pid_tail > /dev/null
    then
        echo "$half_life_pid_tail is running"
    else   
        echo "Starting the tailing..."
        tail -2f $half_life_folder/my_logs.txt &
        echo $! > $half_life_folder/$half_life_pid_tail_file_name
    fi
    
    echo "$@" > /tmp/srv-input
    sleep 1
    
    exit 0
    

    现在每次我想向我的服务器发送命令时,我只是在终端上执行:

    ./send.sh mp_timelimit 30
    

    这个脚本允许我继续跟踪当前终端的进程,因为每次发送命令时,它都会检查后台是否有尾进程。如果没有,它只是启动一个,每次进程发送输出时,我都可以在我用来发送命令的终端上看到它,就像你运行的应用程序附加&运算符一样。

    您可以始终打开另一个打开的终端,只是为了收听我的服务器服务器控制台。要做到这一点,只需使用带有tail标志的-f命令来跟踪我的服务器控制台输出:

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