Даже если Джейкоб, вероятно, никогда не прочтет это, посетители из будущего могут оценить то, что я собираюсь написать.
Мне кажется, я знаю, что не так, и похоже, что это проблема, специфичная для Debian, по крайней мере, проверенная в Ubuntu 11.04 и Debian Squeeze.
Я проследил выполнение от моего /etc/default/varnish
, содержащего $DAEMON_OPTS
, до сценария инициализации.
В скрипте инициализации /etc/init.d/varnish
функция start_varnishd()
:
start_varnishd() {
log_daemon_msg "Starting $DESC" "$NAME"
output=$(/bin/tempfile -s.varnish)
if start-stop-daemon \
--start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- \
-P ${PIDFILE} ${DAEMON_OPTS} > ${output} 2>&1; then
log_end_msg 0
else
log_end_msg 1
cat $output
exit 1
fi
rm $output
}
Так что я изменил его, чтобы вывести полную start-stop-daemon
командную строку, например:
start_varnishd() {
log_daemon_msg "Starting $DESC" "$NAME"
output=$(/bin/tempfile -s.varnish)
+ echo "start-stop-daemon --start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- -P ${PIDFILE} ${DAEMON_OPTS} > ${output} 2>&1"
if start-stop-daemon \
--start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- \
-P ${PIDFILE} ${DAEMON_OPTS} > ${output} 2>&1; then
log_end_msg 0
Итак, я получил командную строку в STDOUT и скопировал ее в мою оболочку. И, сюрприз! Это сработало. WTF?
Повторяется снова, чтобы быть уверенным. Да, это работает. Ммм. Может быть, это еще один из тех случаев с bash / dash?
Давайте попробуем ввести командную строку start-stop-daemon в bash
и посмотрим, как она реагирует:
start_varnishd() {
log_daemon_msg "Starting $DESC" "$NAME"
output=$(/bin/tempfile -s.varnish)
if bash -c "start-stop-daemon \
--start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- \
-P ${PIDFILE} ${DAEMON_OPTS} > ${output} 2>&1"; then
log_end_msg 0
else
log_end_msg 1
cat $output
exit 1
fi
rm $output
}
Да, работает просто отлично , по крайней мере, для моего случая.
Вот соответствующая часть моего /etc/default/varnish
:
...
## Alternative 2, Configuration with VCL
#
# Listen on port 6081, administration on localhost:6082, and forward to
# one content server selected by the vcl file, based on the request. Use a 1GB
# fixed-size cache file.
#
DAEMON_OPTS="-a :6081 \
-T localhost:6082 \
-f /etc/varnish/geoip-example.vcl \
-S /etc/varnish/secret \
-s malloc,100M \
-p 'cc_command=exec cc -fpic -shared -Wl,-x -L/usr/include/GeoIP.h -lGeoIP -o %o %s'"
...
Я видел сообщения, в которых кто-то пытался обойти эту проблему, перемещая команду compile в отдельный скрипт оболочки. К сожалению, это не меняет того факта, что start-stop-daemon
будет передавать $DAEMON_OPTS
var через dash
, и это приведет к искаженным опциям.
Было бы что-то вроде:
-p 'cc_command=exec /etc/varnish/compile.sh %o %s'"
А затем скрипт compile.sh
:
#!/bin/sh
cc -fpic -shared -Wl,-x -L/usr/include/GeoIP.h -lGeoIP -o $@
но это не работает, так что просто исправьте ваши сценарии инициализации, и все готово!
Надеюсь, вы найдете эту информацию полезной.