我正在尝试通过在其中创建带有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个进程..
任何人
答案 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(&
)中运行命令,即在后台运行,因此它不会影响其他命令的当前目录和在命令运行时不会阻止脚本。pgrep -u "$USER" -x "$cmd" >/dev/null || eval "$cmd"
:检查命令是否已使用pgrep
启动,否则(||
)运行命令。