Вот ответ. необходимо использовать 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);
});
}
Вы можете демонизировать любой исполняемый файл в 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 &
Сначала доберитесь 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)
Я думаю, что можно хотеть попробовать start-stop-daemon(8)
. Сценарии выезда в /etc/init.d
в любом дистрибутиве Linux для примеров. Это может найти запущенные процессы командной строкой вызванными или файл PID, таким образом, это соответствует всем Вашим требованиям кроме того, чтобы быть сторожевым таймером для Вашего сценария. Но можно всегда запускать другой сторожевой сценарий демона, который просто перезапускает сценарий при необходимости.
Если Вы используете OS X а именно, я предлагаю, чтобы Вы смотрели на то, как launchd работает. Это автоматически проверит, чтобы гарантировать, что Ваш сценарий работает, и повторно запустите его при необходимости. Это также включает все виды планирования функций и т.д. Должно удовлетворить, что оба требования 1 и 2.
Что касается обеспечения только одной копии Вашего сценария могут работать, необходимо использовать файл PID. Обычно я пишу файл в/var/run/.pid, который содержит PID текущего рабочего экземпляра. если файл существует, когда прогоны программы, он проверяет, работает ли PID в файле на самом деле (программа, возможно, разрушила или иначе забыла удалять файл PID). Если это, аварийное прекращение работы. В противном случае начните работать и перезапишите файл PID.
Daemontools ( http://cr.yp.to/daemontools.html ) - это набор довольно жестких утилит, используемых для этого, написанный dj bernstein. Я использовал это с некоторым успехом. Раздражает то, что ни один из скриптов не возвращает никаких видимых результатов при их запуске - только невидимые коды возврата. Но как только он запущен, он пуленепробиваемый.
Вам следует взглянуть на 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
Прошу прощения за длинный ответ (см. Комментарии о том, как мой ответ соответствует спецификации). Я стараюсь быть исчерпывающим, чтобы у вас была как можно более сильная позиция. : -)
Если у вас есть возможность устанавливать программы (есть root-доступ) и вы готовы выполнить одноразовую легкую работу по настройке вашего скрипта для выполнения демона (т. Е. Более сложный процесс, чем просто указание аргументов командной строки для запускать в командной строке, но это нужно делать только один раз для каждой службы), у меня есть способ более надежный.
Это включает использование daemontools . Остальная часть сообщения описывает, как настроить службы с помощью daemontools.
/ service
. Установщик уже должен был это сделать, но просто проверьте, или при установке вручную. Если вам не нравится это местоположение, вы можете изменить его в своем сценарии svscanboot
, хотя большинство пользователей daemontools привыкли использовать / service
и запутаются, если вы его не используете. init
(т.е., не использует / etc / inittab
), вам нужно будет использовать предустановленный inittab
в качестве основы для организации svscanboot
, вызываемой init
. Это несложно, но вам нужно знать, как настроить init
, который использует ваша ОС.
svscanboot
- это сценарий, который вызывает svscan
, который выполняет основную работу по поиску услуг; он вызывается из init
, поэтому init
организует его перезапуск, если он умирает по какой-либо причине. / var / lib / svscan
, но любое новое местоположение подойдет. Я обычно использую сценарий для настройки каталога служб, чтобы сэкономить много ручной повторяющейся работы. например,
sudo mkservice -d / var / lib / svscan / some-service-name -l -u user -L loguser "командная строка здесь"
где some-service- name
- это имя, которое вы хотите дать своей службе, пользователь
- это пользователь, от имени которого запускается эта служба, а loguser
- это пользователь, от имени которого запускается регистратор. (Ведение журнала объясняется совсем немного.)
fghack
, хотя здесь есть компромисс: вы больше не можете управлять программой с помощью svc
. run
, чтобы убедиться, что он выполняет то, что вы хотите. Вам может потребоваться разместить вызов sleep
вверху, если вы ожидаете, что ваша служба будет часто завершать работу. / service
, указывающую на ваш служебный каталог. (Не помещайте каталоги служб непосредственно в / service
; это затрудняет удаление службы из наблюдения svscan
.) mkservice
); svscan
заботится об отправке сообщений журнала службе ведения журнала. mkservice
, будет создавать файлы журнала с автоповоротом и отметками времени в каталоге log / main
. Текущий файл журнала называется текущий
. tai64nlocal
преобразует отметки времени в удобочитаемый формат. (TAI64N - это 64-битная атомарная временная метка с наносекундным счетчиком.) svstat
для получения статуса службы.Обратите внимание, что служба ведения журнала независима и имеет собственный статус. svc
. Например, чтобы перезапустить службу, используйте svc -t / service / some-service-name
; -t
означает «отправить SIGTERM
». -h
( SIGHUP
), -a
( SIGALRM
), -1
( SIGUSR1
), -2
( SIGUSR2
) и -k
( SIGKILL
). -d
. Вы также можете запретить автоматический запуск службы при загрузке, создав файл с именем вниз
в каталоге службы. -u
. В этом нет необходимости, если вы не отключили его ранее (или не настроили автоматический запуск). -x
; обычно используется с -d
для завершения службы. Это обычный способ разрешить удаление службы, но сначала необходимо отключить службу от / service
, иначе svscan
перезапустит супервизор.
Кроме того, если вы создали свою службу с помощью службы ведения журнала ( mkservice -l
), не забудьте также выйти из супервизора ведения журнала (например, svc -dx / var / lib / svscan / some-service- name / log
) перед удалением каталога службы. Плюсы:
init
. Минусы:
svc
, и не можете запускать сценарии запуска напрямую (поскольку в этом случае они не будут находиться под контролем супервизора). контролируют
процессы в вашей таблице процессов.) В целом, я думаю, что daemontools - отличная система для ваших нужд. Я приветствую любые вопросы о том, как его настроить и поддерживать.
Это рабочая версия с примером, который вы можете скопировать в пустой каталог и опробовать (после установки зависимостей 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