Исходный сценарий обновления bash в фоновом режиме [дубликат]

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

if (!name) {
  name = async1();
}
async2(name);

. В итоге вы пройдете через async1; проверьте, не определено ли name или нет, и соответственно вызовите обратный вызов.

async1(name, callback) {
  if (name)
    callback(name)
  else {
    doSomething(callback)
  }
}

async1(name, async2)

Хотя в в порядке хорошо , это раздражает, когда у вас много подобных случаев и обработка ошибок.

Fibers помогает в решении проблемы.

var Fiber = require('fibers')

function async1(container) {
  var current = Fiber.current
  var result
  doSomething(function(name) {
    result = name
    fiber.run()
  })
  Fiber.yield()
  return result
}

Fiber(function() {
  var name
  if (!name) {
    name = async1()
  }
  async2(name)
  // Make any number of async calls from here
}

Вы можете проверить проект здесь .

45
задан Eric Leschinski 27 October 2014 в 20:38
поделиться

4 ответа

Чтобы запустить его как полный демон из оболочки, вам нужно будет использовать setsid и перенаправить его вывод. Вы можете перенаправить вывод в файл журнала или на /dev/null, чтобы отменить его. Предполагая, что ваш скрипт называется myscript.sh, используйте следующую команду:

setsid myscript.sh >/dev/null 2>&1 < /dev/null &

Это полностью отключит процесс от текущей оболочки (stdin, stdout и stderr). Если вы хотите сохранить вывод в файле журнала, замените первый /dev/null на ваш /path/to/logfile.

Вы должны перенаправить вывод, иначе он не будет работать как истинный демон ( это будет зависеть от вашей оболочки для чтения и записи вывода).

103
ответ дан micromoses 27 August 2018 в 22:10
поделиться

Daemon - это просто программа, которая работает как фоновый процесс, а не находится под прямым контролем интерактивного пользователя ...

[Ниже приведен код bash для систем Debian - Ubuntu, Linux Mint distros и т. д.]

Простой способ:

Простым способом было бы отредактировать файл /etc/rc.local, а затем просто запустить ваш скрипт (т.е. каждый раз вы загружаете систему):

sudo nano /etc/rc.local

Добавьте следующее и сохраните:

#For a BASH script
/bin/sh TheNameOfYourScript.sh > /dev/null &

. Лучшим способом сделать это было бы создание Daemon через Upstart:

sudo nano /etc/init/TheNameOfYourDaemon.conf

добавьте следующее:

description "My Daemon Job"
author "Your Name"
start on runlevel [2345]    

pre-start script
  echo "[`date`] My Daemon Starting" >> /var/log/TheNameOfYourDaemonJobLog.log
end script

exec /bin/sh TheNameOfYourScript.sh > /dev/null &

Сохраните это.

Подтвердите, что он выглядит нормально:

init-checkconf /etc/init/TheNameOfYourDaemon.conf

Теперь перезагрузитесь машина:

sudo reboot

Теперь, когда вы загружаете свою систему, вы можете увидеть файл журнала, в котором указывается, что ваш Daemon запущен:

cat  /var/log/TheNameOfYourDaemonJobLog.log

& bull; Теперь вы можете запустить / остановить / перезапустить / получить статус вашего Daemon с помощью:

restart: это остановится, затем запустите службу

sudo service TheNameOfYourDaemonrestart restart

start: это запустит службу, если она не будет запущена

sudo service TheNameOfYourDaemonstart start

stop: это остановит службу, если она запущена

sudo service TheNameOfYourDaemonstop stop

Состояние : отобразится статус службы

sudo service TheNameOfYourDaemonstatus status
26
ответ дан CMP 27 August 2018 в 22:10
поделиться

Вы можете перейти к /etc/init.d/ - вы увидите шаблон демона, называемый скелетом.

Вы можете его дублировать, а затем ввести свой скрипт под функцию запуска.

14
ответ дан Eric Leschinski 27 August 2018 в 22:10
поделиться

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

name(){
  echo "Do something"
  sleep 1
}

# put a function in the background
name &
#Example taken from here
#https://bash.cyberciti.biz/guide/Putting_functions_in_background

Запуск подоболочки в фоновом режиме

(echo "started"; sleep 15; echo "stopped") &
1
ответ дан Luis Muñoz 27 August 2018 в 22:10
поделиться