#java
#java
Вопрос:
Как определить, запускается ли java из cron или через интерактивную оболочку.
Мне нужно определить, вызван ли скрипт пользователем (показать сообщение об ошибке в sys.out) или cron (отправить ошибку по электронной почте)
Комментарии:
1. Почему бы не сделать его зависимым от переключателя командной строки? Возможно, проще и менее хакерски / надежнее.
Ответ №1:
В вашем задании crontab вы можете передать дополнительный переключатель командной строки, например -Dcron=true
, который вы можете проверить в своем Java-коде, чтобы расширить свою логику.
Ответ №2:
Обычно стандартный вывод и stderr любого задания, выполняемого cron, уже отправляются владельцу cronjob по электронной почте.
Если вы хотите обработать это явно, просто добавьте параметр командной строки, такой как --cron
, который передается в задание cron. Или в более общем смысле --email=bob@whatever
, который позволяет любому вызову отправлять свои выходные данные по электронной почте.
Комментарии:
1. если вы не хотите забивать свой почтовый ящик электронными письмами, вы также можете отправить их в какой-нибудь файл, например <команда для вашей работы> > /home/user/cron_output.txt
Ответ №3:
Я бы поддержал решение -D как наиболее переносимое.
Тем не менее, если вам нужно внедрить решение без настройки, и вы готовы ограничиться определенной версией Unix (например, Linux), вы можете пройти по дереву процессов, чтобы найти, является ли какой-либо из ваших родительских процессов процессом cron:
В Linux прочитайте /proc/self/status:
cat /proc/self/status
Name: bash
State: S (sleeping)
Tgid: 9872
Pid: 9872
PPid: 9870
...
Затем, согласно приведенной выше записи PPid, прочитайте /proc/9870/status, … и продолжайте, пока не достигнете PPid 1, который является инициализацией. Если cron нигде не найден, значит, вы не находитесь под cron.
Я также почти уверен, что где-то в /proc / self вы можете найти прямое указание, под какой консолью / tty выполняется процесс (если нет, то это должен быть демон, запущенный cron или нет), но я не смог найти его сразу.