Это потому что, когда вы извлекаете данные из Firebase, вызов является асинхронным. Что вы можете сделать:
Вариант 1 - Установите логику внутри закрытия (например, что у вас есть, напечатайте var внутри закрытия).
Вариант 2 - Определите свое закрытие, которое получая ваши данные, такие как:
func myMethod(success:([String])->Void){
ref?.observeEventType(.Value, withBlock: { snapshot in
var newNames: [String] = []
for item in snapshot.children {
if let item = item as? FIRDataSnapshot {
let postDict = item.value as! [String: String]
newNames.append(postDict["name"]!)
}
}
success(newNames)
})
}
Вариант 3 - Использовать шаблон делегата
protocol MyDelegate{
func didFetchData(data:[String])
}
class MyController : UIViewController, MyDelegate{
func myMethod(success:([String])->Void){
ref?.observeEventType(.Value, withBlock: { snapshot in
var newNames: [String] = []
for item in snapshot.children {
if let item = item as? FIRDataSnapshot {
let postDict = item.value as! [String: String]
newNames.append(postDict["name"]!)
}
}
self.didFetchData(newNames)
})
}
func didFetchData(data:[String]){
//Do what you want
}
}
Я использовал /etc/crontab
. Я использовал vi
и ввел в PATH, которые мне нужны в этот файл, и запустил его как root. Обычный crontab перезаписывает PATH, которые вы настроили. Хороший учебник о том, как это сделать .
Системный файл cron выглядит так:
This has the username field, as used by /etc/crontab.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file.
# This file also has a username field, that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
42 6 * * * root run-parts --report /etc/cron.daily
47 6 * * 7 root run-parts --report /etc/cron.weekly
52 6 1 * * root run-parts --report /etc/cron.monthly
01 01 * * 1-5 root python /path/to/file.py
Если вы используете webmin
, то это шаги, как установить значение PATH
:
System
-> Scheduled Cron Jobs
-> Create a new environment variable
-> For user: <Select the user name>
-> Variable name: PATH
-> Value: /usr/bin:/bin:<your personal path>
-> Add environment variable: Before all Cron jobs for user
Заставьте переменные работать для вас, это позволит получить доступ t
Определить свой PATH в файле /etc/profile.d/*.sh
Файлы с расширением .sh в каталоге /etc/profile.d выполняются всякий раз, когда вводится оболочка входа bash (например, при входе в систему с консоли или через ssh), как а также DisplayManager при загрузке сеанса рабочего стола.
Вы можете, например, создать файл /etc/profile.d/myenvvars.sh и установить такие переменные как:
export JAVA_HOME=/usr/lib/jvm/jdk1.7.0
export PATH=$PATH:$JAVA_HOME/bin
Выполнение crontab с параметром входа в систему!
Сценарий запуска CRONTAB или команда с переменными среды
0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c 'php -f ./download.php'
0 9 * * * cd /var/www/vhosts/foo/crons/; bash -l -c download.sh
Ваш скрипт работает, когда вы запускаете его с консоли, но сбой в cron.
Ваш crontab не имеет правильного пути переменные (и, возможно, оболочка)
Добавьте свою текущую оболочку и путь к скрипту crontab
#!/bin/bash
#
# Date: August 22, 2013
# Author: Steve Stonebraker
# File: add_current_shell_and_path_to_crontab.sh
# Description: Add current user's shell and path to crontab
# Source: http://brakertech.com/add-current-path-to-crontab
# Github: hhttps://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh
# function that is called when the script exits (cleans up our tmp.cron file)
function finish { [ -e "tmp.cron" ] && rm tmp.cron; }
#whenver the script exits call the function "finish"
trap finish EXIT
########################################
# pretty printing functions
function print_status { echo -e "\x1B[01;34m[*]\x1B[0m $1"; }
function print_good { echo -e "\x1B[01;32m[*]\x1B[0m $1"; }
function print_error { echo -e "\x1B[01;31m[*]\x1B[0m $1"; }
function print_notification { echo -e "\x1B[01;33m[*]\x1B[0m $1"; }
function printline {
hr=-------------------------------------------------------------------------------------------------------------------------------
printf '%s\n' "${hr:0:${COLUMNS:-$(tput cols)}}"
}
####################################
# print message and exit program
function die { print_error "$1"; exit 1; }
####################################
# user must have at least one job in their crontab
function require_gt1_user_crontab_job {
crontab -l &> /dev/null
[ $? -ne 0 ] && die "Script requires you have at least one user crontab job!"
}
####################################
# Add current shell and path to user's crontab
function add_shell_path_to_crontab {
#print info about what's being added
print_notification "Current SHELL: ${SHELL}"
print_notification "Current PATH: ${PATH}"
#Add current shell and path to crontab
print_status "Adding current SHELL and PATH to crontab \nold crontab:"
printline; crontab -l; printline
#keep old comments but start new crontab file
crontab -l | grep "^#" > tmp.cron
#Add our current shell and path to the new crontab file
echo -e "SHELL=${SHELL}\nPATH=${PATH}\n" >> tmp.cron
#Add old crontab entries but ignore comments or any shell or path statements
crontab -l | grep -v "^#" | grep -v "SHELL" | grep -v "PATH" >> tmp.cron
#load up the new crontab we just created
crontab tmp.cron
#Display new crontab
print_good "New crontab:"
printline; crontab -l; printline
}
require_gt1_user_crontab_job
add_shell_path_to_crontab
[/g7]
Я знаю, что на это уже был дан ответ, но я думал, что он будет полезен для некоторых. У меня была аналогичная проблема, которую я недавно решил (, найденный здесь ), и вот основные моменты шагов, которые я предпринял, чтобы ответить на этот вопрос:
* * * * cd /Users/user/Documents/foo; bar -l doSomething -v
Вы должны поместить полные пути в свой crontab
. Это самый безопасный вариант. Если вы не хотите этого делать, вы можете поместить скрипт-оболочку вокруг своих программ и установить там PATH.
, например
01 01 * * * command
, становится:
01 01 * * * /full/path/to/command
Также все, что вызвано из cron
, должно быть очень осторожным в отношении программ, которые он запускает, и, вероятно, установить свой собственный выбор для переменной PATH
.
EDIT:
Если вы не знаете, где команда, которую вы хотите выполнить which <command>
из вашей оболочки, и она сообщит вам путь.
EDIT2:
Итак, как только ваша программа запущена, первое, что он должен сделать, это установить PATH
и любую другую требуемую переменную (например, LD_LIBRARY_PATH
) на значения, которые необходимые для запуска сценария. В основном вместо того, чтобы думать о том, как изменить среду cron, чтобы сделать ее более подходящей для вашей программы / скрипта, сделайте ваш скрипт обработанной средой, которую он задал, установив соответствующий, когда он начнется.
Настройка PATH прямо перед командной строкой в моем crontab работала для меня:
* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing
Скорее всего, cron работает в очень редкой среде. Проверьте переменные среды cron, используя добавление фиктивного задания, которое выдает env
в файл следующим образом:
* * * * * env > env_dump.txt
Сравните это с выходом env
в обычном сеансе оболочки.
Вы можете добавить свои собственные переменные окружения к локальному crontab, указав их в верхней части вашего crontab.
Вот быстрое исправление для добавления $PATH
к текущему crontab:
# echo PATH=$PATH > tmp.cron
# echo >> tmp.cron
# crontab -l >> tmp.cron
# crontab tmp.cron
Получившийся crontab будет похож на ответ chrissygormley, с PATH, определенным перед правилами crontab.
Стандартная среда для заданий cron очень разрежена и может сильно отличаться от среды, в которой вы разрабатываете скрипты python. Для сценария, который может быть запущен в cron, любая среда, на которую вы зависите, должна быть явно задана. В самом файле cron включите полные пути к исполняемым файлам python и вашим скриптам python.
@Trevino: ваш ответ помог мне решить мою проблему. Однако для новичка, пытающегося дать пошаговый подход.
$ echo $JAVA_HOME
$ crontab -e
* * * * * echo $PATH
- это позволяет понять, что означает значение PATH используемый в настоящее время crontab. Запустите crontab и возьмите значение $ PATH, используемое crontab. crontab -e
; b) PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin
(его путь выборки); c) теперь ваше запланированное задание / сценарий, например */10 * * * * sh runMyJob.sh &
; d) удалить echo $PATH
из crontab, поскольку он не нужен сейчас. Установите требуемый PATH в вашем cron
crontab -e
Edit: нажмите i
PATH=/usr/local/bin:/usr/local/:or_whatever
10 * * * * your_command
Сохраните и выйдите :wq
Добавление определения PATH в пользовательский crontab с правильными значениями поможет ... Я заполнил мои только:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
И этого достаточно, чтобы заставить все мои скрипты работать ... Включить любой пользовательский путь там, если вам нужно.
На моем AIX cron поднимаются переменные среды из / etc / environment, игнорируя то, что установлено в .profile.
Редактирование: я также проверил несколько ящиков Linux разных возрастов, и они, похоже, тоже имеют этот файл, поэтому это скорее всего не AIX.
Я проверил это с помощью предложения johnaller cron и проверил вывод до и после редактирования переменной PATH в /etc/environment.
Если вы не хотите делать одни и те же изменения в разных местах, выполните примерно следующее:
* * * * * . /home/username/.bashrc && yourcommand all of your args
. а затем путь к .bashrc и & amp; & amp; команда - это волшебство, позволяющее изменить вашу среду в рабочей оболочке bash. Тоже, если вы действительно хотите, чтобы оболочка была bash, неплохо иметь строку в вашем crontab:
SHELL=/bin/bash
Надеюсь, что это кому-то поможет!