Используя su
без -l
или -
запускается bash
как интерактивное, но оболочка невхода в систему, которая не читает ни из одного из файлов, которые Вы указали. Используйте -l
или -
опция или помещенный соответствующая конфигурация в /root/.bashrc
.
Быстрая сводка файлов конфигурации:
-l
/--login
) чтения /etc/profile
во-первых, и затем первое это находит: ~/.bash_profile
, ~/.bash_login
, и ~/.profile
. -i
) чтения /etc/bash.bashrc
и ~/.bashrc
, в том порядке (если --rcfile
опция используется и говорит этому смотреть в другом месте). -l
или -i
флаги, читает файл, указанный в BASH_ENV
переменная среды. sh
как оболочка входа в систему, это будет читать /etc/profile
и ~/.profile
, в том порядке.sh
как интерактивный невход в систему, это читает файл, указанный в ENV
.php /path/to/script.php > logfile || cat logfile; rm logfile
который выводит стандартный вывод в logfile
и только производит его, если сценарий перестал работать (выходит ненулевой).
Примечание: если Ваш сценарий мог бы также произвести к stderr
затем необходимо перенаправить stderr
кому: stdout
. Иначе что-либо распечатанное к stderr
заставит крон посылать электронное письмо, даже если код выхода будет 0:
php /path/to/script.php > logfile 2>&1 || cat logfile; rm logfile
Так как вывод сгенерирован, прежде чем статус выхода известен, необходимо будет сохранить его где-нибудь.
Одна возможность состоит в том, чтобы сохранить его в переменной оболочки:
output=$(php /path/to/script.php)
if [ $? -ne 0 ]; then
printf "%s\n" "$output"
fi
Это не полностью сохраняет вывод сценария (он удаляет строки конечного пробела), но это хорошо для этого варианта использования. Если Вы хотите сохранить строки конечного пробела:
output=$(php /path/to/script.php; ret=$?; echo a; exit $ret)
if [ $? -ne 0 ]; then
printf "%s" "${output%a}"
fi
Если существует потенциально большой вывод, Вы могли бы предпочесть хранить его во временном файле вместо этого:
output_file=$(mktemp /var/tmp/script.XXXXXXXXXX.out)
php /path/to/script.php >>"$output_file"
ret=$?
if [ $ret -ne 0 ]; then
echo "script.php failed (status $ret), see the output in $output_file"
fi
Рассматривали ли вы хронический из moreutils . Я думаю, это именно то, что вам нужно:
chronic runs a command, and arranges for its standard out and standard error to only be displayed if the command fails (exits nonzero or crashes). If the command succeeds, any extraneous output will be hidden.
В последних версиях есть переключатель -e
, который также показывает полный вывод, если что-то было записано в stderr.