bin sh 启动多个进程

bin sh start multiple processes

我试图通过创建一个包含 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会设置一个watch进程或者node一个http服务器进程,第一个命令会启动(cd ./www/src; node ./index.js;) 而不会继续启动其他进程。

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

有人吗?

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

例如:

#!/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

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

  • 一个名为 spawn_once 的函数将只 运行 命令,如果它还没有 运行ning,因此只允许一个实例
  • 调用 spawn 的第二个函数将 运行 命令,即使它已经 运行ning(允许多个实例)

使用最适合您的用例

#!/bin/sh

# Spawn command  from path 
spawn() {
    local cmd=; local path=
    ( [ ! -z "$path" ] && cd "$path"; eval "$cmd"; ) &
}


# Spawn command  from path , only if command  is not running
# in other words, run only a single instance
spawn_once() {
    local cmd=; local path=
    ( 
      [ ! -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" ] && cd "$path"; eval "$cmd"; ) & :更改目录(如果设置了路径参数)和 运行 子 shell 中的命令 (&),即在后台,因此它不会影响其他命令的当前目录,并且在命令为 运行ning.
  • 时不会阻止脚本
  • spawn_once: pgrep -u "$USER" -x "$cmd" >/dev/null || eval "$cmd" : 检查命令是否已经用pgrep开始,否则(||) 运行命令。