Категории

среда, 21 мая 2014 г.

Автоматическое создание директории /var/run/php5-fpm после перезагрузки

После установки php-fpm, иногда бывает удобно хранить все его сокеты в отдельной папке, например /var/run/php5-fpm, но если вручную создать такую папку, то после перезагрузки система ее удаляет, а в логе можно увидеть типа:
ERROR: unable to bind listening socket for address '/var/run/php5-fpm/default.sock': No such file or directory.
Это связано с тем, что /var/run монтируется с опцией --bind из /run [1], где файловая система tmpfs, логично, что после перезагрузки все, что создавал пользователь - удаляется! Но не проблема, значит перед запуском демона, нужно проверять, существует ли каталог, если нет, то создавать.
Для решения данной проблемы нужно отредактировать init-скрипт /etc/init.d/php5-fpm, добавив вверху, после переменной SCRIPTNAME строчку:
SOCKETDIR=/var/run/$NAME
А затем, под "do_start() {" добавить еще одну строчку:
[ -d $SOCKETDIR ] || install -m 777 -o www-data -g root -d $SOCKETDIR
-m 777 я указал намеренно, т.к. у меня fpm пулы запускаются от разных uid:gid, если у вас все пулы работают от 1 пользователя, то можете указать -m 755.
Теперь, при запуске php-fpm демона, каталог с сокетами в /var/run будет создаваться автоматически.
UPDATE: 15.10.2014
Для тех кто пользуется upstart, приводим файл /etc/init/php5-fpm.conf к такому виду:
# php5-fpm - The PHP FastCGI Process Manager

description "The PHP FastCGI Process Manager"
author "Ondřej Surý "

start on runlevel [2345]
stop on runlevel [016]

# Precise upstart does not support reload signal, and thus rejects the
# job. We'd rather start the daemon, instead of forcing users to
# reboot https://bugs.launchpad.net/ubuntu/+source/php5/+bug/1272788
#
# reload signal USR2

pre-start script
    [ -d /var/run/php5-fpm ] || install -m 777 -o www-data -g root -d /var/run/php5-fpm
    /usr/lib/php5/php5-fpm-checkconf
end script

respawn
exec /usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf
Изменился блок pre-start, теперь там script, в котором собственно и стоит проверка каталога /var/run/php5-fpm, идея подсмотрена в /etc/init/mysql.conf. Для применения изменений в upstart скрипты, необходимо выполнить команды:
root@Ubuntu# initctl reload-configuration
root@Ubuntu# initctl stop php5-fpm
initctl: Unknown instance: 
root@Ubuntu# initctl start php5-fpm
php5-fpm start/running, process 18467
Обязательно stop (если был запущен демон php5-fpm), а затем start. Если демон php-fpm не был запущен, то restart скажет вам "initctl: Unknown instance:" и не запустит демона. Так что лучше сперва stop и затем start - это избавит от лишних раздумий, как устроена система upstart и почему restart не запускает демона.
Логи запуска через upstart можно подглядеть в dmesg, /var/log/upstart/php5-fpm.log. P.S. команды service php5-fpm start будут обработаны upstart, а init.d скрипты проигнорированы, так вот запутано все в Ubuntu.
Ссылки по теме:
1. Opennet.ru: В Fedora и других Linux-дистрибутивах появится директория /run
2. Создание директории /var/run/php5-fpm после перезагрузки

понедельник, 5 мая 2014 г.

Ubuntu 12.04 не запускается автоматически samba на bridge интерфейсе.

При старте системы демон samba не запускался самостоятельно, точнее он запускался, но был недоступен, а если вручную перезапустить его, то все ок. Сетевые интерфейсы у меня объединены в bridge (br0) wlan0 и eth0. После недолгих расследований логов загрузки, стало ясно, демон smbd успевает запуститься, до того, как bridge сконфигурируется, отсюда и проблема.
Конфигурационный файл /etc/init/smbd.conf привел к такому виду:
description "SMB/CIFS File Server"
author      "Steve Langasek "

start on (local-filesystems and net-device-up IFACE!=lo)
start on (local-filesystems and net-device-up IFACE=br0)
stop on runlevel [!2345]

respawn

pre-start script
 RUN_MODE="daemons"

 [ -r /etc/default/samba ] && . /etc/default/samba

 [ "$RUN_MODE" = inetd ] && { stop; exit 0; }

 install -o root -g root -m 755 -d /var/run/samba
end script

exec smbd -F
А именно, добавил опцию IFACE=br0:
start on (local-filesystems and net-device-up IFACE=br0)
Теперь, при загрузке сервера, демон smbd запускается самостоятельно.
Ссылки по теме:
1. Что такое UpStart

воскресенье, 4 мая 2014 г.

flock - предотвращение повторного запуска программы/скрипта из crontab.

Столкнулся с проблемой, написанный мною бот для сайта запускался раз в минуту и однажды на сервере, где работал бот интернет канал сильно просел, как результат за минуту бот не успел завершить свою работу.
crontab запустил его еще раз, бот снова не успел, а crontab продолжал беспощадно запускать копии бота - последствия были не очень приятными.
Но проблема решилась очень просто, через flock.
Теперь скрипт не запускается до тех пор, пока предыдущий запуск не закончит работу!
Например, запуск произвольного скрипта из crontab раз в минуту:
* * * * * root flock -n /tmp/script.lock -c /path/to/script.sh
Рассмотрим опции: -n /tmp/script.lock - путь до lock файла.
-c /path/to/script.sh - путь до скрипта или программы, которую нужно запустить.
Эта утилита имеется штатно на FreeBSD и Linux.