bin sh启动多个进程

时间:2015-06-15 21:23:28

标签: shell service terminal bin

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

E.g:

#!/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;)而不是继续启动其他进程。 / p>

我无法弄清楚如何独立启动所有4个进程..

任何人

2 个答案:

答案 0 :(得分:0)

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

例如:

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

答案 1 :(得分:0)

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

  • 一个名为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" ] && cd "$path"; eval "$cmd"; ) &:更改目录(如果设置了路径参数)并在子shell(&)中运行命令,即在后台运行,因此它不会影响其他命令的当前目录和在命令运行时不会阻止脚本。
  • spawn_once:pgrep -u "$USER" -x "$cmd" >/dev/null || eval "$cmd":检查命令是否已使用pgrep启动,否则(||)运行命令。