Назад | Перейти на главную страницу

Как сценарий sh может определить, было ли оно запущено как задание cron, а не как интерактивное или фоновое?

Я хотел бы использовать один и тот же сценарий для cron и интерактивного, просто интересно, есть ли универсальный способ в системах UNIX / Linux, чтобы легко сделать это определение.

Вы можете попробовать вернуть имя родительского процесса примерно так: -

ps -ocommand= -p $PPID | awk -F/ '{print $NF}' | awk '{print $1}'

Для меня это вернулось консоль когда я запускал это в интерактивном режиме.

или вы можете написать какую-нибудь логику для обработки ситуаций.

while getopts cm opt
do
case $opt in
        c)
                ##  Do crontask 
        ;;
        m)
                ##  Do manual
        ;;
        esac
done

Теперь при выполнении скрипта вы можете передать параметр в виде атрибута, например: -

/use/local/bin/example.sh -m
/use/local/bin/example.sh -c

универсального пути нет вообще. использование интерактивного / неинтерактивного обнаружения оболочки или обнаружения tty также не является надежным, поскольку другие случаи, кроме cron, могут иметь эти характеристики. просто добавьте переменную в запись cron. скажем, вам нужно запустить test.sh, а затем используйте его.

$ RUNENV=cron ./test.sh
cron
cat ./test.sh 
#!/bin/sh
echo $RUNENV

Это довольно просто и надежно, если вы контролируете настройку cron.

Я не знаю, насколько это портативно, но в Linux вы можете запустить tty и проверьте, является ли вывод tty.

$ tty
/dev/pts/2
$ crontab -e
* * * * * echo $(tty) >> /home/paulo/cron_tty
[Wait a minute...]
$ cat /home/paulo/cron_tty
not a tty

Обратите внимание, что tty также не будет установлен, если сценарий работает не в интерактивном режиме из чего-то другого, кроме cron, но поскольку вы сказали, что хотите отличить cron от интерактивного, это не должно быть проблемой.

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