Определить, запускается ли java из cron или через shell

#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 или нет), но я не смог найти его сразу.