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
开始,否则(||
) 运行命令。
我试图通过创建一个包含 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
开始,否则(||
) 运行命令。