2015-06-15 4 views
1

Я пытаюсь запустить несколько процессов для моего сервера разработки, создав файл #!/Bin/sh с командами оболочки.bin sh start несколько процессов

Например:

#!/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, первая команда запустит (кд ./www/src; узел ./index.js;) и не продолжать запускать другие процессы.

Я не могу понять, как начать все 4 процесса независимо друг от друга ..

Любой?

ответ

0

Я бы предпочел, чтобы написать некоторые функции нереститься каждый процесс последовательно:

  • One функция, называемая 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";) &: сменить каталог (если был задан аргумент пути) и запустить команду в подоболочке (&), то есть в фоновом режиме, чтобы она не влияла на текущий адрес tory для других команд и не блокирует скрипт во время выполнения команды.
  • spawn_once: pgrep -u "$USER" -x "$cmd" >/dev/null || eval "$cmd": Проверьте, была ли эта команда уже запущена с pgrep, иначе (||) выполните команду.
+0

В этом случае я получаю следующую ошибку: «./ startup: 3: ./startup: Ошибка синтаксиса: «(« неожиданно ».. – Pieter

+0

Прилагаете ли вы команду со своими аргументами в кавычках, как показано выше? Можете ли вы показать мне ваш точный сценарий? Вы можете использовать pastebin/gist и т. д. – henfiber

+0

Я так думаю :) Проверьте: http://pastebin.com/XcAicGQG – Pieter

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 
+0

Спасибо, Роберт. Но команда pushd создает ошибки: ./startup: 6: ./startup: pushd: не найдено ./startup: 8: ./startup: popd: не найдено ./startup: 9: ./startup: pushd: not found./startup: 6: ./startup: pushd: not found – Pieter

+0

Так что используйте cd, это тоже правильно. Не забудьте изменить правильную директорию для каждой команды. –