2017-01-14 2 views
1

У меня есть файл node.js, который принимает целочисленный arg.Получить скрипт bash для запуска node.js

Я пытаюсь написать сценарий bash, который ищет количество доступных ядер и запускает main.js для каждого доступного ядра.

Для 1 ядра он должен вызвать:

node main.js 3000 & 

Для 2-жильный:

node main.js 3000 & 
node main.js 30001 & 

И так далее ...

Это мой Баш скрипт:

#!/bin/bash 
numCores=`getconf _NPROCESSORS_ONLN` 
i=0 
j=3000 
while [ $i < $numCores ] 
do 
    j=$($j+$i) 
    node /myApp/main.js $j & 
    i=$($i+1) 
done 

Когда я пытаюсь запустить его, я получаю это ошибка:

bash launchnode.sh 
launchnode.sh: line 5: 2: No such file or directory 

main.js и launchchnode.sh находятся в этом же каталоге.

Любая помощь?

+3

http://shellcheck.net/ поймал бы это (и кучу других ошибок) для вас автоматически. –

+1

j = $ (($ j + $ i)) double круглые скобки для арифметики – kubanczyk

ответ

3

Ошибка здесь:

while [ $i < $numCores ] 

В Баш < для перенаправления ввода. [ является псевдонимом для команды test и test 0 < 2 означает «послать входные данные из файла с именем 2 к команде test 0.

Вместо этого используйте опцию -lttest«s для менее чем сравнение. Кроме того, не стоит забывать, процитировать переменные:

while [ "$i" -lt "$numCores" ] 

Или, если вы только таргетинг Баш, вы можете использовать арифметическое расширение:

while ((i < numCores)) 

Кроме того, необходимо использовать двойные круглые скобки на последующих строках для арифметических операций:

i=$(($j+$i)) 
+2

Одна проблема - не единственная проблема. 'while ((i

+2

На самом деле, я бы предложил 'for ((порт = 3000; порт <(3000 + numCores); порт ++)); сделать узел /myApp/main.js "$ port" & done'. Вся математика находится внутри условия цикла 'for' C-стиля, включая инициализацию, сравнение и приращение. –

+0

Хороший улов @CharlesDuffy. Благодарю. –

Смежные вопросы