Я могу воспроизвести ваше поведение, если использую псевдоним fi
:
$ alias fi=:
+ alias fi=:
$ . ./test
+ . ./test
++ set -x
bash: ./test: line 6: syntax error: unexpected end of file
Он работает, когда вы выполняете его, но не работает, когда вы его создаете, потому что псевдонимы недоступны в неинтерактивных оболочках (тип оболочки, запускающий сценарии оболочки). Как объясняется в руководстве bash :
Псевдонимы не раскрываются, когда оболочка не интерактивна, если только параметр оболочки
expand_aliases
не установлен с помощьюshopt
(см. The Shopt Builtin ).
Однако, когда вы источник
что-то, он запускается в вашей текущей оболочке, которая, поскольку она интерактивна, уже загрузила псевдонимы, и поэтому псевдоним fi
распознается и прерывается. поиск.
Извините за очень поздний ответ.
Сценарии инициализации не предназначены для постоянного выполнения. Под этим я подразумеваю, что сценарии инициализации должны запускать программу, а затем выходить, оставляя программу работающей в фоновом режиме. Таким образом, система инициализации узнает, что достигнут уровень выполнения.
Поэтому я бы рекомендовал положить ваш скрипт в отдельную папку, скажем /usr/bin
. Вот что он будет содержать:
#!/bin/sh
while true
do
/usr/bin/php /var/www/cron.php
sleep 5
done
В сценарии инициализации введите следующее:
#!/bin/sh
### BEGIN INIT INFO
# Provides: 5_second_cron
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: PHP Loop
# Description: Initiate a given PHP file every 5 seconds
### END INIT INFO
case "$1" in
start)
setsid /path/to/your/script.sh >/dev/null 2>&1 < /dev/null &
;;
*)
;;
esac
Это позволяет сценарию принимать аргумент start
таким образом, как он вызывается, а также отсоединяет реальный сценарий от процесса в качестве фонового демона.
После этих правок просто запустите:
$ sudo insserv 5_second_cron