Путь к классам времени выполнения 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
.
Вместо того, чтобы обнаружить, когда скрипт запущен от crontab, вероятно, легче обнаружить при выполнении его вручную.
Существует много переменных среды (в $ _ENV массив), которые установлены, когда Вы запускаете скрипт из командной строки. То, что это, будет варьироваться в зависимости от Вашего разъединять установку и как Вы входите в систему. В моей среде следующие переменные среды установлены при запущении скрипта вручную, которые не присутствуют при выполнении от крона:
Также существуют другие. Так, например, если бы Вы всегда используете SSH для доступа к полю, затем следующая строка обнаружила бы, если сценарий работает от крона:
$cron = !isset($_ENV['SSH_CLIENT']);
В команде крона добавить ?source=cron
в конец пути сценария. Затем в Вашем сценарии проверить $_GET['source']
.
Править: извините, это - сценарий оболочки, так не может использовать qs. Я думаю, можно передать аргументы в форме php script.php arg1 arg2
и затем считайте их с $argv
.
Я изучил бы $_ENV
(var_dump () это) и проверка, если Вы замечаете различие при выполнении его по сравнению с тем, когда cronjob выполняет его. Кроме этого я не думаю, что существует "официальный" переключатель, который говорит Вам, что произошло.
$_SERVER['SESSIONNAME']
содержит Console
если выполнено от CLI. Возможно, это помогает.
Я думаю, что было бы лучше запустить команду cron с дополнительной опцией в командной строке, которую вы не запускаете вручную.
cron сделает:
command ext_updates=1
manual сделает:
command
Просто добавьте опцию в самом скрипте, чтобы параметр ext_updates имел значение по умолчанию false.
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();
}
Правильный подход - использовать функцию posix_isatty(), например, для дескриптора файла stdout, например, так:
if (posix_isatty(STDOUT))
/* do interactive terminal stuff here */
Не то, чтобы я знаю о - вероятно, простое решение обеспечивает дополнительный параметр самостоятельно для сообщения сценария, как это было вызвано.
Я не знаю о 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
Это "хождение по решению для" дерева процесса означает, что Вы не должны волноваться о представлении искусственного параметра, чтобы указать, работаете ли Вы под кроном или не - можно забыть делать это на интерактивной сессии и вещах материала.
Можно установить дополнительный параметр или добавить строку в crontab, возможно:
CRON=running
И затем можно проверить переменные среды на "КРОН". Кроме того, попытайтесь проверить переменную $SHELL, я не уверен, устанавливает ли крон ее на.