Выполнение системных команд в Node.js. Аналог exec

👁 72 просмотров

К счастью в Node.js есть такой аналог в виде модуля и он так и называется exec. Данный модуль предлагает лучшее из мира spawn и exec.

Устанавливается модуль очень легко:

npm install exec

Также легко и использовать. Сначала подключаем модуль:

var exec = require('exec');

Пример использования:

var exec = require('exec');
 
exec(['ls', '-lha'], function(err, out, code) {
  if (err instanceof Error)
    throw err;
  process.stderr.write(err);
  process.stdout.write(out);
  process.exit(code);
});

Или так:

exec('cat foo | grep bar', function(err, out, code) {
  if (err instanceof Error)
    throw err;
  process.stderr.write(err);
  process.stdout.write(out);
  process.exit(code);
});

Дополнительно можно почитать тут.

 

Запуск приложения Node.js в фоновом режиме

👁 271 просмотров

Допустим, мы создали приложение Node.js и хотим, чтобы при выходе из консоли после запуска через npm start/node index.js через команду Ctrl + C или из ssh — клиента наше приложение продолжало выполняться, как нормальный сервер. Для этого есть несколько способов, чтобы это решить.

Запуск в фоновом режиме при помощи nohup

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

$ nohup node simple-server.js> output.log &

или

$ nohup npm start> output.log &

Эта строчка говорит о том, чтобы мы запустили приложение Node.js в фоновом режиме, а все логи записывались в файл output.log.

Использование модуля Forever

Цель Forever — постоянно поддерживать дочерний процесс (например, веб-сервер node.js) и автоматически перезапускать его при неожиданном выходе из него.

Установить данный модуль можно следующей командой:

$ [sudo] npm install forever

Самые простые команды для использования данного модуля — это четыре простые задачи командной строки: start, stop, stopall, list:

usage: forever [start | stop | stopall | list] [options] SCRIPT [script options]

options:
  start          start SCRIPT as a daemon
  stop           stop the daemon SCRIPT
  stopall        stop all running forever scripts
  list           list all running forever scripts

Чтобы использовать Forever, как долговременный процесс, нужно запустить процесс через команду «start». Имея эти задачи, запуск сценария nodejs с Forever прост:

$ forever start simple-server.js 
$ forever list 
  [0] simple-server.js [24597, 24596]

Первая команда запускает скрипт simple-server.js в фоновом режиме с помощью daemon.node и возвращает управление текущему процессу оболочки. Вторая команда перечисляет все процессы, выполняемые с Forever. Идентификаторами после имени сценария являются идентификаторы процесса целевого скрипта и демона, которые будут запущены всегда, пока работает сервер. Мы можем подтвердить это, просмотрев список процессов:

$ ps axl | grep node 
  501 24596 1 0 31 0 Ss ?? 0: 00.03 node / usr / local / bin / forever start simple-server.js 
  501 24597 24412 0 31 0 S ?? 0: 00.07 узел simple-server.js

Чтобы проиллюстрировать, что Forever автоматически перезапустит дочерний процесс, который, каким-либо образом был закрыт в процессе перезагрузки или ошибки. Для этого давайте принудительно убьем запущенный процесс и проверим перезапустит ли Forever его:

$ kill 24597 
$ forever list 
  [0] simple-server.js [24611, 24596]

Как вы видите, идентификатор процесса целевого скрипта «simple-server.js» изменился с 24597 до 24611, что указывает на то, что новый процесс был запущен Forever. Таким образом, наш целевой скрипт будет работать непрерывно, но как мы его остановим? Остановка процесса с Forever проста из командной строки. Нам просто нужно передать индекс этого процесса из списка «вечный список» на остановку:

$ forever stop 0 
Forever остановил процесс: 
  [0] simple-server.js [24611, 24596]

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

  1. Forever отслеживает запущенные процессы в файлах * .fvr, которые помещаются в /tmp/forever/pids;
  2. Каждый процесс Forever будет генерировать уникальный файл журнала, помещенный в /tmp/forever/*.log;
  3. Если не указано иное, вывод дочернего процесса stdout и stderr будет записан в указанный выше файл журнала.

Подробнее об этих параметрах можно узнать из использования Forever и документации по Github .

Использование модуля PM2

Последняя стабильная версия PM2 устанавливается через NPM:

npm install pm2@latest -g

Самый простой способ запустить, демонзировать и контролировать ваше приложение — это использовать эту командную строку:

pm2 start app.js

Можно, также, декларировать управление несколькими приложениями, для этого нужно создать файл конфигурации со следующим содержимым:

apps:
  - script   : app.js
    instances: 4
    exec_mode: cluster
  - script : worker.js
    watch  : true
    env    :
      NODE_ENV: development
    env_production:
      NODE_ENV: production

И далее очень просто их запускаем:

pm2 start process.yml

Подробнее об объявлении приложения читайте здесь .

Перезапуск PM2 с процессами, которые вы выполняете при загрузке / перезагрузке сервера, имеет решающее значение. Чтобы решить эту проблему, просто запустите эту команду для создания активного сценария запуска:

pm2 startup

Дополнительно тут.

Вот некоторые команды, которые стоит знать:

# Fork mode
pm2 start app.js --name my-api # Name process

# Cluster mode
pm2 start app.js -i 0        # Will start maximum processes with LB depending on available CPUs
pm2 start app.js -i max      # Same as above, but deprecated.

# Listing

pm2 list               # Display all processes status
pm2 jlist              # Print process list in raw JSON
pm2 prettylist         # Print process list in beautified JSON

pm2 describe 0         # Display all informations about a specific process

pm2 monit              # Monitor all processes

# Logs

pm2 logs [--raw]       # Display all processes logs in streaming
pm2 flush              # Empty all log files
pm2 reloadLogs         # Reload all logs

# Actions

pm2 stop all           # Stop all processes
pm2 restart all        # Restart all processes

pm2 reload all         # Will 0s downtime reload (for NETWORKED apps)

pm2 stop 0             # Stop specific process id
pm2 restart 0          # Restart specific process id

pm2 delete 0           # Will remove process from pm2 list
pm2 delete all         # Will remove all processes from pm2 list

# Misc

pm2 reset <process>    # Reset meta data (restarted time...)
pm2 updatePM2          # Update in memory pm2
pm2 ping               # Ensure pm2 daemon has been launched
pm2 sendSignal SIGUSR2 my-app # Send system signal to script
pm2 start app.js --no-daemon
pm2 start app.js --no-vizion
pm2 start app.js --no-autorestart

 

Пожалуй, основные из вышеизложенного списка:

pm2 start app.js           # Start app.js

pm2 start app.js -- -a 23  # Pass arguments '-a 23' argument to app.js script

pm2 start app.js --name serverone # Start a process and name it as serverone
                                    # you can now stop the process by doing
                                    # pm2 stop serverone

pm2 start app.js --node-args="--debug=7001" # --node-args to pass options to node V8

pm2 start app.js -i 0             # Start maximum processes depending on available CPUs (cluster mode)

pm2 start app.js --log-date-format "YYYY-MM-DD HH:mm Z"    # Log will be prefixed with custom time format

pm2 start app.json                # Start processes with options declared in app.json
                                    # Go to chapter Multi process JSON declaration for more

pm2 start app.js -e err.log -o out.log  # Start and specify error and out log

 

Если используется фреймворк express, то команда запуска приложения в демон-режиме будет выглядеть так:

 pm2 start bin/www  -i 0 --name "appName"

или просто, без дополнительного мониторинга:

pm2 start bin/www

Базовые команды:

 Basic Examples:

    Start an app using all CPUs available + set a name :
    $ pm2 start app.js -i 0 --name "api"

    Restart the previous app launched, by name :
    $ pm2 restart api

    Stop the app :
    $ pm2 stop api

    Restart the app that is stopped :
    $ pm2 restart api

    Remove the app from the process list :
    $ pm2 delete api

    Kill daemon pm2 :
    $ pm2 kill

    Update pm2 :
    $ npm install pm2@latest -g ; pm2 update

    More examples in https://github.com/Unitech/pm2#usagefeatures

  Deployment help:

    $ pm2 deploy help

 

Создание приложения Node.js при помощи фреймворка express.js

👁 94 просмотров

Рассмотрим пример создания приложения Node.js на основе популярного фреймворка express.js

Установка express.js

Для установки достаточно набрать команду:

$ npm install -g express --save

Установка генератора приложений Express

Для быстрого создания «скелета» приложения используется инструмент для генерации приложений express. Установите express с помощью следующей команды:

$ npm install -g express-generator --save

Для просмотра опций команды воспользуйтесь опцией -h:

$ express -h

  Usage: express [options][dir]

  Options:

    -h, --help          output usage information
        --version       output the version number
    -e, --ejs           add ejs engine support
        --hbs           add handlebars engine support
        --pug           add pug engine support
    -H, --hogan         add hogan.js engine support
    -v, --view <engine> add view <engine> support (ejs|hbs|hjs|jade|pug|twig|vash) (defaults to jade)
    -c, --css <engine>  add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
        --git           add .gitignore
    -f, --force         force on non-empty directory

 

Создание приложения express.js

Например, следующая команда создает приложение Express с именем myapp в текущем рабочем каталоге:

$ express --view=pug myapp

   create : myapp
   create : myapp/package.json
   create : myapp/app.js
   create : myapp/public
   create : myapp/public/javascripts
   create : myapp/public/images
   create : myapp/routes
   create : myapp/routes/index.js
   create : myapp/routes/users.js
   create : myapp/public/stylesheets
   create : myapp/public/stylesheets/style.css
   create : myapp/views
   create : myapp/views/index.pug
   create : myapp/views/layout.pug
   create : myapp/views/error.pug
   create : myapp/bin
   create : myapp/bin/www

Затем установите зависимости:

$ cd myapp
$ npm install

В MacOS или Linux запустите приложение с помощью следующей команды:

$ DEBUG=myapp:* npm start

В Windows используется следующая команда:

> set DEBUG=myapp:* & npm start

Затем откройте страницу http://localhost:3000/ в браузере для доступа к приложению.

Структура каталогов сгенерированного приложения выглядит следующим образом:

.
├── app.js
├── bin
│   └── www
├── package.json
├── public
│   ├── images
│   ├── javascripts
│   └── stylesheets
│       └── style.css
├── routes
│   ├── index.js
│   └── users.js
└── views
    ├── error.pug
    ├── index.pug
    └── layout.pug

7 directories, 9 files