PHP может обнаружить если его выполнение от задания крона или из командной строки?

Путь к классам времени выполнения Webapp - беспорядок.

Избавиться от этих JAR в / WEB-INF / lib

  • javaee-web-api-7.0.jar
  • javax.faces-2.2.5.jar
  • javax.servlet-api-3.0.1.jar

Первый из них предназначен для компиляции WAR / EAR, нацеленного на контейнер Java EE 7. Он не намерен устанавливаться вдоль WAR-таргетинга на бобовидный JSP / сервлет-контейнер, такой как Tomcat. Было бы смутно и думать, что это на самом деле контейнер Java EE 7 (oh joy).

Второй - Mojarra 2.2.5 (API и имплекс в комплекте с одним JAR-ароматом) и причина начальная проблема вы видите. Вы в основном загружаете реализацию JSF 2.2 против API JSF 2.1, уже ранее загруженного через Tomcat /lib. javax.faces.lifecycle.ClientWindowFactory является новым с JSF 2.2 (см. Также @since в javadoc ) и не распознается API JSF 2.1.

Третий должен быть уже предоставлен Сам Томкат. Обратите внимание, что Java EE 7 JAR также содержит API JSF 2.2 и Servlet 3.1. Таким образом, это на самом деле тройной конфликт для API JSF и Servlet (один API из /lib от Tomcat, один API из WAR /WEB-INF/lib и один API из пакета JAR Java JE 7 JAR, это не хорошо).

Независимо от того, я рекомендую также очистить Tomcat / lib и сохранить его по умолчанию. Просто придерживайтесь JAR в WAR / WEB-INF / lib. И если вы намереваетесь создать целевое веб-приложение JSF 2.2 (первый doublecheck version в faces-config.xml, если он совпадает), тогда сохраните в javax.faces-2.2.5.jar и избавьтесь от файлов jsf-api-2.1.13.jar и jsf-impl-2.1.13.jar.

51
задан Uberfuzzy 10 October 2008 в 10:37
поделиться

11 ответов

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

Существует много переменных среды (в $ _ENV массив), которые установлены, когда Вы запускаете скрипт из командной строки. То, что это, будет варьироваться в зависимости от Вашего разъединять установку и как Вы входите в систему. В моей среде следующие переменные среды установлены при запущении скрипта вручную, которые не присутствуют при выполнении от крона:

  • ТЕРМИН
  • SSH_CLIENT
  • SSH_TTY
  • SSH_CONNECTION

Также существуют другие. Так, например, если бы Вы всегда используете SSH для доступа к полю, затем следующая строка обнаружила бы, если сценарий работает от крона:

$cron = !isset($_ENV['SSH_CLIENT']);

43
ответ дан Paul Stone 7 November 2019 в 09:42
поделиться

В команде крона добавить ?source=cron в конец пути сценария. Затем в Вашем сценарии проверить $_GET['source'].

Править: извините, это - сценарий оболочки, так не может использовать qs. Я думаю, можно передать аргументы в форме php script.php arg1 arg2 и затем считайте их с $argv.

1
ответ дан Jason Plank 7 November 2019 в 09:42
поделиться

Я изучил бы $_ENV (var_dump () это) и проверка, если Вы замечаете различие при выполнении его по сравнению с тем, когда cronjob выполняет его. Кроме этого я не думаю, что существует "официальный" переключатель, который говорит Вам, что произошло.

4
ответ дан Till 7 November 2019 в 09:42
поделиться

$_SERVER['SESSIONNAME'] содержит Console если выполнено от CLI. Возможно, это помогает.

1
ответ дан Jason Plank 7 November 2019 в 09:42
поделиться
if(!$_SERVER['HTTP_HOST']) {
 blabla();
}
0
ответ дан Jason Plank 7 November 2019 в 09:42
поделиться

Я думаю, что было бы лучше запустить команду cron с дополнительной опцией в командной строке, которую вы не запускаете вручную.

cron сделает:

command ext_updates=1

manual сделает:

command 

Просто добавьте опцию в самом скрипте, чтобы параметр ext_updates имел значение по умолчанию false.

0
ответ дан 7 November 2019 в 09:42
поделиться

In my environment, I found that TERM was set in $_SERVER if run from the command line, but not set if run via Apache as a web request. I put this at the top of my script that I might run from the command line, or might access via a web browser:

if (isset($_SERVER{'TERM'}))
{
    class::doStuffShell();
}
else
{
    class::doStuffWeb();
}
3
ответ дан 7 November 2019 в 09:42
поделиться

Правильный подход - использовать функцию posix_isatty(), например, для дескриптора файла stdout, например, так:

if (posix_isatty(STDOUT))
    /* do interactive terminal stuff here */
15
ответ дан 7 November 2019 в 09:42
поделиться

Не то, чтобы я знаю о - вероятно, простое решение обеспечивает дополнительный параметр самостоятельно для сообщения сценария, как это было вызвано.

5
ответ дан Dominic Rodger 7 November 2019 в 19:42
поделиться

Я не знаю о PHP конкретно, но Вы могли идти по дереву процесса, пока Вы не нашли или init или крон.

Принятие PHP может получить свой собственный идентификатор процесса и выполнить внешние команды, это должен быть вопрос выполнения ps -ef | grep pid, где изодромный с предварением Ваш собственный идентификатор процесса, и извлеките идентификатор родительского процесса (PPID) из него.

Тогда делают то же к этому PPID до Вас или достигают крона как родителя или init как родитель.

, Например, это - мое дерево процесса, и Вы видите цепочку принадлежности, 1-> 6386-> 6390-> 6408.

UID     PID  PPID  C  STIME  TTY        TIME  CMD
root      1     0  0  16:21  ?      00:00:00  /sbin/init
allan  6386     1  0  19:04  ?      00:00:00  gnome-terminal --geom...
allan  6390  6386  0  19:04  pts/0  00:00:00  bash
allan  6408  6390  0  19:04  pts/0  00:00:00  ps -ef

те же процессы, выполненные под кроном, были бы похожи:

UID     PID  PPID  C  STIME  TTY        TIME  CMD
root      1     0  0  16:21  ?      00:00:00  /sbin/init
root   5704     1  0  16:22  ?      00:00:00  /usr/sbin/cron
allan  6390  5704  0  19:04  pts/0  00:00:00  bash
allan  6408  6390  0  19:04  pts/0  00:00:00  ps -ef

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

6
ответ дан paxdiablo 7 November 2019 в 19:42
поделиться

Можно установить дополнительный параметр или добавить строку в crontab, возможно:

CRON=running

И затем можно проверить переменные среды на "КРОН". Кроме того, попытайтесь проверить переменную $SHELL, я не уверен, устанавливает ли крон ее на.

29
ответ дан Matthew Scharley 7 November 2019 в 19:42
поделиться
Другие вопросы по тегам:

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