Получить журналы за последние 30 минут

Как отлаживать проблемы shell_exec

Хорошо, здесь у нас есть проблема: что-то работает в терминал и не работает в php shell_exec (или exec, spawn и т. д.). Давайте подумаем: в чем разница между You и php? Вот три:

PHP выполняется из правил HTTP-сервера

Действительно, ваш терминал запущен от пользователя ваше имя , а php выполняется из www-data .Итак, первая идея - открыть терминал пользователя www-data и попробовать ту же команду. Итак ....

  • Откройте файл / etc / passwd , найдите строку с пользователем www-data и измените оболочку входа (последнюю) с / bin / false (или что-то еще) в / bin / bash .
  • Откройте терминал www-data : su www-data
  • Попробуйте php -v или что-то еще. Вы не можете выполнить с php. Если не сработает - вы увидите красивые логи и сможете отладить проблему.
  • Не забудьте исправить обратно / etc / passwd файл, пока все готово

PHP выполняется из PHP .

PHP - это параноик, и в конфигурации apache / nginx и php.ini есть множество опций, которые могут помешать вашей попытке.

Это немного сложнее отладить. Здесь есть два варианта:

  • Включить журналы в браузере и увидеть проблему. Отредактируйте свой php.ini , включите display_errors и все другие флаги, чтобы видеть ошибки в браузере. Их можно читать и отлаживать.

  • Получите оболочку www-data (см. Первый раздел) и выполните что-то вроде

echo ' '| php

, который выполнит тот же код php в консоли, и вы сможете видеть ошибки и отлаживать.

PHP выполняется из SELinux / apparmor

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

Для проверки - отключите selinux / apparmor и проверьте, существует ли проблема.

Чтобы исправить - прочтите соответствующее руководство и исправьте разрешающие запись для Вашего случая.

1
12.04.2019, 15:40
2 ответа

Вы можете попробовать это

awk -vStartDate=`date -d'now-30 min' +%H:%M:%S` '{ if ($2 > StartDate) print $0}' web.log
0
27.01.2020, 23:30

Вы можете печатать строки на основе флага, который устанавливается, только если первое поле является полем даты. см. следующий код с флагом p, чтобы указать awk печатать (, когда p==1), или пропускать (, когдаp==0)строка

awk -v tstart="$start" -v tend="$end" '
    /^[0-9]{4}-[0-9]{2}-[0-9]{2}/ {
        t = $1 " " $2
        p = t >= tstart && t <= tend ? 1 : 0
    }p' webservice_logs.log

Поскольку в начале строк ERROR нет метки времени, в таких строках не происходит изменения флага.

Правка В одной строке:

awk -v tstart="$start" -v tend="$end" '/^[0-9]{4}-[0-9]{2}-[0-9]{2}/{t = $1 " " substr($2,1,5); p = t >= tstart && t <= tend ? 1 : 0}p' webservice_logs.log
2
27.01.2020, 23:30

Теги

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