Python Selenium Script не работает над crontab [duplicate]

Это потому что, когда вы извлекаете данные из 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
    }

}
96
задан Chris Martin 22 February 2016 в 23:57
поделиться

15 ответов

Я использовал /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
127
ответ дан tambre 19 August 2018 в 10:53
поделиться
  • 1
    Это работает с crontab -e на уровне пользователя, и это безопаснее. – Robert Brisita 5 September 2013 в 23:28
  • 2
    Могу ли я использовать bash вместо sh? – qed 29 November 2013 в 23:55
  • 3
    Да @qed, вы можете :) – Pierre Ozoux 5 August 2014 в 09:02
  • 4
    странно (для меня), что установленный по умолчанию / PATH, установленный в / etc / crontab, как показано @chrissygormley, а также установленный в моем (Ubuntu) crontab, отличается от пути в / etc / environment, в частности он помещает / sbin и / bin впереди / usr / sbin и / usr / bin. Теперь я изменил это в моем / etc / crontab, чтобы сделать его таким же, как пользовательская среда. – scoobydoo 22 April 2015 в 06:17
  • 5
    Не работает для меня. Я выводил содержимое cron в файл. Cron работает, файл создается, но он не помещает в него какой-либо контент. – Volatil3 31 July 2015 в 06:08

Если вы используете 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
-1
ответ дан Al Bundy 19 August 2018 в 10:53
поделиться

Заставьте переменные работать для вас, это позволит получить доступ t

Определить свой PATH в файле /etc/profile.d/*.sh

Общесистемная среда variables

Файлы с расширением .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
13
ответ дан Artistan 19 August 2018 в 10:53
поделиться

Проблема

Ваш скрипт работает, когда вы запускаете его с консоли, но сбой в 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

Источник

https://github.com/ssstonebraker/braker-scripts/blob/master/working-scripts/add_current_shell_and_path_to_crontab.sh

Образец Выход

add_curent_shell_and_path_to_crontab.sh example output [/g7]

8
ответ дан brakertech 19 August 2018 в 10:53
поделиться

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

  1. убедитесь, что у вас есть переменные, которые вам нужны в PYTHONPATH (здесь и здесь и для получения дополнительной информации здесь) внутри .profile или .bash_profile для любой оболочки, которую вы хотите протестировать для своего скрипта, чтобы убедиться, что она работает.
  2. отредактируйте свой crontab включить каталоги, необходимые для запуска вашего скрипта в задании cron (здесь и здесь). a) обязательно укажите корневой каталог в переменной PATH (.), как описано здесь (в основном, если вы используете исполняемый файл с помощью своей команды должен быть в состоянии найти корень или каталог, в котором хранится исполняемый файл) и, возможно, эти (/ sbin: / bin: / usr / sbin: / usr / bin)
  3. в вашем файле crontab, создайте cronjob, который изменит каталог в каталог, в котором вы успешно запускали скрипт раньше (например, Users / user / Documents / foo). a) Это будет выглядеть следующим образом:
    * * * * cd /Users/user/Documents/foo; bar -l doSomething -v 
    
2
ответ дан Community 19 August 2018 в 10:53
поделиться

Вы должны поместить полные пути в свой crontab. Это самый безопасный вариант. Если вы не хотите этого делать, вы можете поместить скрипт-оболочку вокруг своих программ и установить там PATH.

, например

01 01 * * * command

, становится:

01 01 * * * /full/path/to/command

Также все, что вызвано из cron, должно быть очень осторожным в отношении программ, которые он запускает, и, вероятно, установить свой собственный выбор для переменной PATH.

EDIT:

Если вы не знаете, где команда, которую вы хотите выполнить which <command> из вашей оболочки, и она сообщит вам путь.

EDIT2:

Итак, как только ваша программа запущена, первое, что он должен сделать, это установить PATH и любую другую требуемую переменную (например, LD_LIBRARY_PATH) на значения, которые необходимые для запуска сценария. В основном вместо того, чтобы думать о том, как изменить среду cron, чтобы сделать ее более подходящей для вашей программы / скрипта, сделайте ваш скрипт обработанной средой, которую он задал, установив соответствующий, когда он начнется.

19
ответ дан Douglas Leeder 19 August 2018 в 10:53
поделиться
  • 1
    если в вашем пути используется «какая команда», и он даст вам полный путь – Paul Whelan 5 March 2010 в 17:09
  • 2
    @Douglas Leeder - Когда вы говорите, что полный путь в cron, вы имеете в виду положить его в crontab или другой файл? Если это так, вы можете сделать это, если команда cron: '01 01 * * * command '. благодаря – chrissygormley 5 March 2010 в 17:13
  • 3
    @chrissygormley - Да crontab. – Douglas Leeder 5 March 2010 в 17:31
  • 4
    Извините, что должно быть какое-то замешательство. Я переформулировал вопрос выше. – chrissygormley 5 March 2010 в 18:08

Настройка PATH прямо перед командной строкой в ​​моем crontab работала для меня:

* * * * * PATH=$PATH:/usr/local/bin:/path/to/some/thing
12
ответ дан gilad mayani 19 August 2018 в 10:53
поделиться
  • 1
    предпочитают этот путь. или указать полный путь к сценарию. – zw963 13 April 2017 в 13:29
  • 2
    Это будет добавляться в $ PATH каждый раз, когда он запускается. Ваша $ PATH будет расти и расти – blueether 5 May 2018 в 01:09

Скорее всего, 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.

41
ответ дан joemaller 19 August 2018 в 10:53
поделиться

Стандартная среда для заданий cron очень разрежена и может сильно отличаться от среды, в которой вы разрабатываете скрипты python. Для сценария, который может быть запущен в cron, любая среда, на которую вы зависите, должна быть явно задана. В самом файле cron включите полные пути к исполняемым файлам python и вашим скриптам python.

2
ответ дан mob 19 August 2018 в 10:53
поделиться

@Trevino: ваш ответ помог мне решить мою проблему. Однако для новичка, пытающегося дать пошаговый подход.

  1. Получите текущую установку java через $ echo $JAVA_HOME
  2. $ crontab -e
  3. * * * * * echo $PATH - это позволяет понять, что означает значение PATH используемый в настоящее время crontab. Запустите crontab и возьмите значение $ PATH, используемое crontab.
  4. Теперь отредактируйте crontab еще раз, чтобы установить нужный путь в java bin: a) crontab -e; b) PATH=<value of $JAVA_HOME>/bin:/usr/bin:/bin (его путь выборки); c) теперь ваше запланированное задание / сценарий, например */10 * * * * sh runMyJob.sh &; d) удалить echo $PATH из crontab, поскольку он не нужен сейчас.
1
ответ дан Ram Dwivedi 19 August 2018 в 10:53
поделиться

Установите требуемый PATH в вашем cron

crontab -e

Edit: нажмите i

PATH=/usr/local/bin:/usr/local/:or_whatever

10 * * * * your_command

Сохраните и выйдите :wq

0
ответ дан shiva 19 August 2018 в 10:53
поделиться

Добавление определения PATH в пользовательский crontab с правильными значениями поможет ... Я заполнил мои только:

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

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

8
ответ дан Treviño 19 August 2018 в 10:53
поделиться

На моем AIX cron поднимаются переменные среды из / etc / environment, игнорируя то, что установлено в .profile.

Редактирование: я также проверил несколько ящиков Linux разных возрастов, и они, похоже, тоже имеют этот файл, поэтому это скорее всего не AIX.

Я проверил это с помощью предложения johnaller cron и проверил вывод до и после редактирования переменной PATH в /etc/environment.

2
ответ дан Van Amburg 19 August 2018 в 10:53
поделиться

Если вы не хотите делать одни и те же изменения в разных местах, выполните примерно следующее:

* * * * * . /home/username/.bashrc && yourcommand all of your args

. а затем путь к .bashrc и & amp; & amp; команда - это волшебство, позволяющее изменить вашу среду в рабочей оболочке bash. Тоже, если вы действительно хотите, чтобы оболочка была bash, неплохо иметь строку в вашем crontab:

SHELL=/bin/bash

Надеюсь, что это кому-то поможет!

1
ответ дан Wade Chandler 19 August 2018 в 10:53
поделиться
1
ответ дан tasket 30 October 2018 в 23:12
поделиться
Другие вопросы по тегам:

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