Как делают меня daemonize произвольный сценарий в Unix?

Вот ответ. необходимо использовать async и ожидать во время вызова API во внутренних аксио.

getAllLeague() {
        axios.get(BASE_URL + 'leagues').then(async (response) => {
            var arrData = [];
            for(var i=0; i<response.data.length; i++) {

                var data = {
                    "leagueid": response.data[i].leagueid,
                    "description": response.data[i].description,
                    "itemdef": response.data[i].itemdef,
                    "name": response.data[i].name,
                    "tournament_url": response.data[i].tournament_url,
                    "prize_pool" : ''
                }

                await axios.get(BASE_URL + 'getTournamentPrizePool/' + response.data[i].leagueid).then((response) => {
                    data.prize_pool = response.data.prize_pool;
                })

                arrData.push(data);
            }

            console.log(arrData);
            this.setState({
                leagueList : arrData
            });
        }).catch((error) => {
            console.log(error);
        });
    }
91
задан Community 23 May 2017 в 11:54
поделиться

8 ответов

Вы можете демонизировать любой исполняемый файл в Unix, используя nohup и оператор &:

nohup yourScript.sh script args&

Команда nohup позволяет завершить сеанс оболочки, не убивая ваш скрипт, а & помещает ваш скрипт в фоновый режим, чтобы вы получили приглашение оболочки для продолжения сеанса. Единственная небольшая проблема с этим - стандартный выход и стандартная ошибка, которые отправляются в ./nohup.out, поэтому, если вы запустите несколько скриптов в этом поместье, их вывод будет переплетен. Лучшей командой будет:

nohup yourScript.sh script args >script.out 2>script.error&

Это отправит стандартную ошибку в файл по вашему выбору и стандартную ошибку в другой файл по вашему выбору. Если вы хотите использовать только один файл как для стандартного вывода, так и для стандартной ошибки, вы можете использовать это:

nohup yourScript.sh script args >script.out 2>&1 &

2> & 1 указывает оболочке перенаправить стандартную ошибку (дескриптор файла 2) в тот же файл, что и стандартный файл (дескриптор файла 1 ).

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

#!/bin/bash

if [[ $# < 1 ]]; then
    echo "Name of pid file not given."
    exit
fi

# Get the pid file's name.
PIDFILE=$1
shift

if [[ $# < 1 ]]; then
    echo "No command given."
    exit
fi

echo "Checking pid in file $PIDFILE."

#Check to see if process running.
PID=$(cat $PIDFILE 2>/dev/null)
if [[ $? = 0 ]]; then
    ps -p $PID >/dev/null 2>&1
    if [[ $? = 0 ]]; then
        echo "Command $1 already running."
        exit
    fi
fi

# Write our pid to file.
echo $$ >$PIDFILE

# Get command.
COMMAND=$1
shift

# Run command until we're killed.
while true; do
    $COMMAND "$@"
    sleep 10 # if command dies immediately, don't go into un-ctrl-c-able loop
done

Первый аргумент - это имя используемого файла pid. Второй аргумент - это команда. А все остальные аргументы являются аргументами команды.

Если вы назовете этот сценарий restart.sh, то вы бы назвали его так:

nohup restart.sh pidFileName yourScript.sh script args >script.out 2>&1 &
89
ответ дан 24 November 2019 в 06:47
поделиться

Сначала доберитесь createDaemon() от http://code.activestate.com/recipes/278731/

Затем основной код:

import subprocess
import sys
import time

createDaemon()

while True:
    subprocess.call(" ".join(sys.argv[1:]),shell=True)
    time.sleep(10)
3
ответ дан Joshua 24 November 2019 в 06:47
поделиться

Я думаю, что можно хотеть попробовать start-stop-daemon(8) . Сценарии выезда в /etc/init.d в любом дистрибутиве Linux для примеров. Это может найти запущенные процессы командной строкой вызванными или файл PID, таким образом, это соответствует всем Вашим требованиям кроме того, чтобы быть сторожевым таймером для Вашего сценария. Но можно всегда запускать другой сторожевой сценарий демона, который просто перезапускает сценарий при необходимости.

11
ответ дан Alex B 24 November 2019 в 06:47
поделиться

Если Вы используете OS X а именно, я предлагаю, чтобы Вы смотрели на то, как launchd работает. Это автоматически проверит, чтобы гарантировать, что Ваш сценарий работает, и повторно запустите его при необходимости. Это также включает все виды планирования функций и т.д. Должно удовлетворить, что оба требования 1 и 2.

Что касается обеспечения только одной копии Вашего сценария могут работать, необходимо использовать файл PID. Обычно я пишу файл в/var/run/.pid, который содержит PID текущего рабочего экземпляра. если файл существует, когда прогоны программы, он проверяет, работает ли PID в файле на самом деле (программа, возможно, разрушила или иначе забыла удалять файл PID). Если это, аварийное прекращение работы. В противном случае начните работать и перезапишите файл PID.

5
ответ дан Kamil Kisiel 24 November 2019 в 06:47
поделиться

Daemontools ( http://cr.yp.to/daemontools.html ) - это набор довольно жестких утилит, используемых для этого, написанный dj bernstein. Я использовал это с некоторым успехом. Раздражает то, что ни один из скриптов не возвращает никаких видимых результатов при их запуске - только невидимые коды возврата. Но как только он запущен, он пуленепробиваемый.

5
ответ дан 24 November 2019 в 06:47
поделиться

Вам следует взглянуть на daemonize . Он позволяет обнаружить вторую копию (но использует механизм блокировки файлов). Также он работает с разными дистрибутивами UNIX и Linux.

Если вам нужно автоматически запускать ваше приложение как демон, вам необходимо создать соответствующий сценарий инициализации.

Вы можете использовать следующий шаблон:

#!/bin/sh
#
# mydaemon     This shell script takes care of starting and stopping
#               the <mydaemon>
#

# Source function library
. /etc/rc.d/init.d/functions


# Do preliminary checks here, if any
#### START of preliminary checks #########


##### END of preliminary checks #######


# Handle manual control parameters like start, stop, status, restart, etc.

case "$1" in
  start)
    # Start daemons.

    echo -n $"Starting <mydaemon> daemon: "
    echo
    daemon <mydaemon>
    echo
    ;;

  stop)
    # Stop daemons.
    echo -n $"Shutting down <mydaemon>: "
    killproc <mydaemon>
    echo

    # Do clean-up works here like removing pid files from /var/run, etc.
    ;;
  status)
    status <mydaemon>

    ;;
  restart)
    $0 stop
    $0 start
    ;;

  *)
    echo $"Usage: $0 {start|stop|status|restart}"
    exit 1
esac

exit 0
12
ответ дан 24 November 2019 в 06:47
поделиться

Прошу прощения за длинный ответ (см. Комментарии о том, как мой ответ соответствует спецификации). Я стараюсь быть исчерпывающим, чтобы у вас была как можно более сильная позиция. : -)

Если у вас есть возможность устанавливать программы (есть root-доступ) и вы готовы выполнить одноразовую легкую работу по настройке вашего скрипта для выполнения демона (т. Е. Более сложный процесс, чем просто указание аргументов командной строки для запускать в командной строке, но это нужно делать только один раз для каждой службы), у меня есть способ более надежный.

Это включает использование daemontools . Остальная часть сообщения описывает, как настроить службы с помощью daemontools.

Первоначальная установка

  1. Следуйте инструкциям в Как установить daemontools . В некоторых дистрибутивах (например, Debian, Ubuntu) уже есть пакеты для него, поэтому просто используйте их.
  2. Создайте каталог под названием / service . Установщик уже должен был это сделать, но просто проверьте, или при установке вручную. Если вам не нравится это местоположение, вы можете изменить его в своем сценарии svscanboot , хотя большинство пользователей daemontools привыкли использовать / service и запутаются, если вы его не используете.
  3. Если вы используете Ubuntu или другой дистрибутив, в котором не используется стандартный init (т.е., не использует / etc / inittab ), вам нужно будет использовать предустановленный inittab в качестве основы для организации svscanboot , вызываемой init . Это несложно, но вам нужно знать, как настроить init , который использует ваша ОС. svscanboot - это сценарий, который вызывает svscan , который выполняет основную работу по поиску услуг; он вызывается из init , поэтому init организует его перезапуск, если он умирает по какой-либо причине.

Настройка для каждой службы

  1. Каждой службе требуется каталог служб , в котором хранится служебная информация об услуге. Вы также можете создать место для размещения этих служебных каталогов, чтобы все они были в одном месте; обычно я использую / var / lib / svscan , но любое новое местоположение подойдет.
  2. Я обычно использую сценарий для настройки каталога служб, чтобы сэкономить много ручной повторяющейся работы. например,

     sudo mkservice -d / var / lib / svscan / some-service-name -l -u user -L loguser "командная строка здесь" 
     

    где some-service- name - это имя, которое вы хотите дать своей службе, пользователь - это пользователь, от имени которого запускается эта служба, а loguser - это пользователь, от имени которого запускается регистратор. (Ведение журнала объясняется совсем немного.)

  3. Ваша служба должна запускать на переднем плане . Если ваша программа фоновая по умолчанию, но есть возможность отключить это, сделайте это.Если у вашей программы нет возможности отключить ее, прочтите fghack , хотя здесь есть компромисс: вы больше не можете управлять программой с помощью svc .
  4. Отредактируйте сценарий run , чтобы убедиться, что он выполняет то, что вы хотите. Вам может потребоваться разместить вызов sleep вверху, если вы ожидаете, что ваша служба будет часто завершать работу.
  5. Когда все настроено правильно, создайте символическую ссылку в / service , указывающую на ваш служебный каталог. (Не помещайте каталоги служб непосредственно в / service ; это затрудняет удаление службы из наблюдения svscan .)

Ведение журнала

  1. Способ daemontools ведение журнала - чтобы служба записывала сообщения журнала в стандартный вывод (или стандартную ошибку, если вы используете сценарии, созданные с помощью mkservice ); svscan заботится об отправке сообщений журнала службе ведения журнала.
  2. Служба ведения журнала принимает сообщения журнала со стандартного ввода. Сценарий службы ведения журнала, сгенерированный mkservice , будет создавать файлы журнала с автоповоротом и отметками времени в каталоге log / main . Текущий файл журнала называется текущий .
  3. Службу ведения журнала можно запускать и останавливать независимо от основной службы.
  4. Передача файлов журнала по конвейеру через tai64nlocal преобразует отметки времени в удобочитаемый формат. (TAI64N - это 64-битная атомарная временная метка с наносекундным счетчиком.)

Управляющие службы

  1. Используйте svstat для получения статуса службы.Обратите внимание, что служба ведения журнала независима и имеет собственный статус.
  2. Вы управляете своей службой (запуск, остановка, перезапуск и т. Д.) С помощью svc . Например, чтобы перезапустить службу, используйте svc -t / service / some-service-name ; -t означает «отправить SIGTERM ».
  3. Другие доступные сигналы: -h ( SIGHUP ), -a ( SIGALRM ), -1 ( SIGUSR1 ), -2 ( SIGUSR2 ) и -k ( SIGKILL ).
  4. Чтобы отключить службу, используйте -d . Вы также можете запретить автоматический запуск службы при загрузке, создав файл с именем вниз в каталоге службы.
  5. Чтобы запустить службу, используйте -u . В этом нет необходимости, если вы не отключили его ранее (или не настроили автоматический запуск).
  6. Чтобы попросить супервизора выйти, используйте -x ; обычно используется с -d для завершения службы. Это обычный способ разрешить удаление службы, но сначала необходимо отключить службу от / service , иначе svscan перезапустит супервизор. Кроме того, если вы создали свою службу с помощью службы ведения журнала ( mkservice -l ), не забудьте также выйти из супервизора ведения журнала (например, svc -dx / var / lib / svscan / some-service- name / log ) перед удалением каталога службы.

Резюме

Плюсы:

  1. daemontools обеспечивает надежный способ создания служб и управления ими. Я использую его на своих серверах и очень рекомендую.
  2. Его система регистрации очень устойчива, как и функция автоматического перезапуска службы.
  3. Поскольку он запускает службы с помощью сценария оболочки, который вы пишете / настраиваете, вы можете адаптировать свою службу по своему усмотрению.
  4. Мощные инструменты управления сервисом: вы можете послать сервису практически любой сигнал и можете надежно запускать и останавливать сервисы.
  5. Вашим службам гарантирована чистая среда выполнения: они будут выполняться с той же средой, ограничениями процессов и т. Д., Как то, что предоставляет init .

Минусы:

  1. Каждая служба требует небольшой настройки. К счастью, это нужно делать только один раз для каждой службы.
  2. Службы должны быть настроены для работы на переднем плане. Кроме того, для достижения наилучших результатов они должны быть настроены для ведения журнала стандартного вывода / стандартной ошибки, а не системного журнала или других файлов.
  3. Крутая кривая обучения, если вы новичок в способах работы с daemontools. Вы должны перезапустить службы, используя svc , и не можете запускать сценарии запуска напрямую (поскольку в этом случае они не будут находиться под контролем супервизора).
  4. Множество служебных файлов и множество служебных процессов. Каждой службе нужен собственный каталог служб, и каждая служба использует один процесс супервизора для автоматического перезапуска службы в случае ее смерти. (Если у вас много сервисов, вы увидите лоты из контролируют процессы в вашей таблице процессов.)

В целом, я думаю, что daemontools - отличная система для ваших нужд. Я приветствую любые вопросы о том, как его настроить и поддерживать.

32
ответ дан 24 November 2019 в 06:47
поделиться

Это рабочая версия с примером, который вы можете скопировать в пустой каталог и опробовать (после установки зависимостей CPAN, которыми являются Getopt :: Long , File :: Spec , File :: Pid и IPC :: System :: Simple - все довольно стандартные и настоятельно рекомендуются для любого хакера: вы можете установить их все сразу с помощью cpan <имя модуля> <имя модуля> ... ).


keepAlive.pl:

#!/usr/bin/perl

# Usage:
# 1. put this in your crontab, to run every minute:
#     keepAlive.pl --pidfile=<pidfile> --command=<executable> <arguments>
# 2. put this code somewhere near the beginning of your script,
#    where $pidfile is the same value as used in the cron job above:
#     use File::Pid;
#     File::Pid->new({file => $pidfile})->write;

# if you want to stop your program from restarting, you must first disable the
# cron job, then manually stop your script. There is no need to clean up the
# pidfile; it will be cleaned up automatically when you next call
# keepAlive.pl.

use strict;
use warnings;

use Getopt::Long;
use File::Spec;
use File::Pid;
use IPC::System::Simple qw(system);

my ($pid_file, $command);
GetOptions("pidfile=s"   => \$pid_file,
           "command=s"   => \$command)
    or print "Usage: $0 --pidfile=<pidfile> --command=<executable> <arguments>\n", exit;

my @arguments = @ARGV;

# check if process is still running
my $pid_obj = File::Pid->new({file => $pid_file});

if ($pid_obj->running())
{
    # process is still running; nothing to do!
    exit 0;
}

# no? restart it
print "Pid " . $pid_obj->pid . " no longer running; restarting $command @arguments\n";

system($command, @arguments);

example.pl:

#!/usr/bin/perl

use strict;
use warnings;

use File::Pid;
File::Pid->new({file => "pidfile"})->write;

print "$0 got arguments: @ARGV\n";

Теперь вы можете вызвать приведенный выше пример с помощью: ./ keepAlive.pl --pidfile = pidfile --command =. / Example.pl 1 2 3 и файл pidfile будут созданы, и вы увидите результат:

Pid <random number here> no longer running; restarting ./example.pl 1 2 3
./example.pl got arguments: 1 2 3
1
ответ дан 24 November 2019 в 06:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: