вывод текста cronjob обрезан - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть cronjob, который запускает скрипт на Python каждые 2 часа. Сам скрипт может работать дольше 2 часов. Вот почему я пытаюсь определить, запущен ли скрипт. Система является FreeBSD машиной. Я пытаюсь сделать обнаружение с помощью следующей функции:

def script_already_running(script_name,console_logger,parameter=None):
    """
    checks if the script is already running, this is done by syscall and parsing the output. Parameters of the script can be distinguished as well
    """
    ps = subprocess.Popen("ps aux", shell=True, stdout=subprocess.PIPE)
    process_strings = ps.stdout.read().decode(encoding="utf-8",errors="strict")
    ps.stdout.close()
    ps.wait()
    console_logger.info(process_strings)
    # print(process_strings)
    # print(script_name)

    if script_name in process_strings and parameter is None:
        script_running = True
    elif script_name in process_strings and parameter is not None:
        if parameter in process_strings:
            script_running = True
        else:
            script_running = False
    else:
        script_running = False

    return script_running

эта функция вызывается из другого скрипта. script_name - это имя (с путем) вызывающего скрипта, а console_logger - это объект python logging. Когда я выполняю все прямо из оболочки, все работает просто отлично. Функция выводит вывод ps aux, который выглядит так (я удалил ненужный остаток)

USER    PID %CPU %MEM    VSZ    RSS TT  STAT STARTED       TIME COMMAND
mysql  7225 95.8  1.1 530948 190652  -  IJ   Sun12   3750:03.47 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin --log-error=/var/db/mysql/test_jail.err --pid-
user  56261 22.8  0.4 195936  60040  0  S+J  22:14      0:02.74 python3 testscript.py (python3.6)
user  50756  0.6  0.5 220976  78068  -  SsJ  21:20      3:25.17 python3 /home/user/immoquery/src/testscript.py (python3.6)

Таким образом, вы можете видеть, что он никогда не будет работать, потому что при запуске он всегда обнаруживает, что работает. Это еще одна проблема, которую мне нужно решить в будущем. Но когда я просматриваю логи, что cronjob создает вывод ps aux, выглядит так:

USER    PID %CPU %MEM     VSZ     RSS TT  STAT STARTED       TIME COMMAND
mysql  7225 92,4  1,3  530948  224528  -  IJ   So.12   3179:35,23 /usr/local/li
user  80177 24,9  0,4  196016   60184  -  SsJ  09:20      0:02,83 python3 /home
user  68285  0,5  7,2 1343792 1198784  -  SsJ  07:20      6:46,38 python3 /home

Проверка доставляет false, поскольку она не может найти имя сценария в строке, возвращаемой ps aux. Строка как-то обрезана.

Вот содержимое файла cron:

SHELL=/usr/local/bin/zsh
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"

# used to execute immobilienscout24 kaufangebote
#minute hour    mday    month   wday    command
20       7,9,11,13,15,17,19,21,23 *       *       *      python3 /home/user/immoquery/src/testscript.py >> /home/user/testscript.log 2>&1

Кто-нибудь знает, как это исправить? Почему отключен выход процесса? Есть размер виртуального экрана или что-то в этом роде?

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Чтобы получить полную командную строку из ps, используйте -ww (два двойных-нас). pgrep - лучшее решение.

Возможно, даже лучше может быть использование файла блокировки (в локальной файловой системе, например, под /var/run или даже /tmp где-то).

0 голосов
/ 07 ноября 2018

Вы можете сделать это просто, сделав что-то вроде:

0 */2 * * *  if ! pgrep -f your-script 2>&1 >/dev/null; then your-script; fi

Способ, которым он работает, заключается в проверке, выполняется ли процесс с помощью pgrep, и, если нет, он запустит ваш скрипт.

...