Я хотел бы использовать один и тот же сценарий для 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 или нет, как предлагается в Вопрос о переполнении стека.