【问题标题】:bin sh start multiple processesbin sh 启动多个进程
【发布时间】:2015-06-15 21:23:27
【问题描述】:

我正在尝试通过创建一个包含 shell 命令的 #!/bin/sh 文件来为我的开发服务器启动多个进程。

例如:

#!/bin/sh

read -p "Start all servers? (Y/n)" answer
if test "$answer" = "Y"
then
    cd ./www/src; node ./index.js;
    cd ./www/; ./gulp;
    cd ./api/; nodemon ./init.js;
    cd ./api-test/; node ./index.js;
else
    echo "Cancelled."   
fi

因为例如 nodemon 将设置一个监视进程或节点一个 http 服务器进程,所以第一个命令将启动 (cd ./www/src; node ./index.js;) 而不会继续启动其他进程。

我不知道如何独立启动所有 4 个进程..

有人吗?

【问题讨论】:

    标签: shell service terminal bin


    【解决方案1】:

    我更愿意编写一些函数来一致地生成每个进程:

    • 一个名为spawn_once 的函数只会在命令尚未运行时运行,因此只允许一个实例
    • 名为spawn 的第二个函数将运行该命令,即使它已经在运行(允许多个实例)

    使用最适合您的用例

    #!/bin/sh
    
    # Spawn command $1 from path $2
    spawn() {
        local cmd=$1; local path=$2
        ( [ ! -z "$path" ] && cd "$path"; eval "$cmd"; ) &
    }
    
    
    # Spawn command $1 from path $2, only if command $1 is not running
    # in other words, run only a single instance
    spawn_once() {
        local cmd=$1; local path=$2
        ( 
          [ ! -z "$path" ] && cd "$path"
          pgrep -u "$USER" -x "$cmd" >/dev/null || eval "$cmd"
        ) &
    }
    
    
    # Use spawn or spawn_once to start your multiple commands
    # The format is: spawn "<command with args>" "<path>"
    spawn "node ./index.js" "./www/src"
    spawn_once "./gulp" "./www/"  # only one instance allowed
    spawn "node ./index.js" "./api-test/"
    

    解释:

    • ( [ ! -z "$path" ] &amp;&amp; cd "$path"; eval "$cmd"; ) &amp; :更改目录(如果设置了路径参数)并在子shell(&amp;)中运行命令,即在后台,因此它不会影响其他命令的当前目录并且不会阻塞脚本,而命令正在运行。
    • spawn_once: pgrep -u "$USER" -x "$cmd" &gt;/dev/null || eval "$cmd" :检查命令是否已经以pgrep 启动,否则(||)运行命令。

    【讨论】:

    • 在这种情况下,我收到以下错误:"./startup: 3: ./startup: Syntax error: "(" unexpected"..
    • 您是否将命令及其参数括在引号中,如上所示?你能告诉我你的确切脚本吗?您可以使用 pastebin/gist 等。
    • 您的脚本对我来说工作正常,没有错误。你系统中/bin/sh --version 的输出是什么?您使用的是什么操作系统?我还进行了一些编辑以提高对旧 shell 的兼容性。您可以使用新版本再试一次。最后,您可以尝试将第一行(shebang)更改为 #! /usr/bin/bash(如果 bash 可用),以检查您的 /bin/sh 是否是不支持功能的旧 shell
    • 谢谢@henfiber!将 #!/bin/sh 更改为 #!/bin/bash 似乎已经解决了问题 :) 感谢上面提供的出色功能,正是我所需要的!
    • 很高兴它对您有用。如果您认为此答案解决了您的问题,您可以将其标记为已接受。
    【解决方案2】:

    您可以使用和号“&”在后台执行任务

    例如:

    #!/bin/sh
    
    read -p "Start all servers? (Y/n)" answer
    if test "$answer" = "Y"
    then
        cd ./www/src
        node ./index.js &
        cd $OLDPWD && cd ./www/
        ./gulp &
    .........
    
    else
        echo "Cancelled."   
    fi
    

    【讨论】:

    • 谢谢罗伯特。但是 pushd 命令会产生错误:./startup: 6: ./startup: pushd: not found ./startup: 8: ./startup: popd: not found ./startup: 9: ./startup: pushd: not found。 /startup: 6: ./startup: pushd: 未找到
    • 所以使用 cd 代替,这也是正确的。不要忘记为每个命令更改到正确的目录
    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 2022-01-20
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多