В то время как обещания и обратные вызовы хорошо работают во многих ситуациях, боль в задней части выражает нечто вроде:
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
}
Чтобы запустить его как полный демон из оболочки, вам нужно будет использовать setsid
и перенаправить его вывод. Вы можете перенаправить вывод в файл журнала или на /dev/null
, чтобы отменить его. Предполагая, что ваш скрипт называется myscript.sh, используйте следующую команду:
setsid myscript.sh >/dev/null 2>&1 < /dev/null &
Это полностью отключит процесс от текущей оболочки (stdin, stdout и stderr). Если вы хотите сохранить вывод в файле журнала, замените первый /dev/null
на ваш /path/to/logfile.
Вы должны перенаправить вывод, иначе он не будет работать как истинный демон ( это будет зависеть от вашей оболочки для чтения и записи вывода).
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
Вы можете перейти к /etc/init.d/ - вы увидите шаблон демона, называемый скелетом.
Вы можете его дублировать, а затем ввести свой скрипт под функцию запуска.
Еще один классный трюк - запустить функции или подоболочки в фоновом режиме, не всегда выполнимые, хотя
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") &