В ряде случаев, когда программа умеет создавать pid-файл и не умеет переходить в фоновый режим, оказывается полезной опция --background, доступная через start-stop-daemon: $ /sbin/start-stop-daemon --help|grep background -b|--background force the process to detach К сожалению, данная опция недоступна в функции start_daemon из /etc/rc.d/init.d/functions. При этом в start_daemon есть опция --make-pidfile, которая задаёт два параметра к start-stop-daemon --make-pidfile и --background. Такая связка, видимо, предполагается удобной, но имеет два недостатка - она позволяет повторно запустить службу, поскольку при создании PID-файла не проверяет существующий, а также не позволяет запускать в фоне те приложения, которые сами умеют создавать PID-файлы. Для решения этой проблемы предлагается добавить опцию --background к функции start_daemon. Патч в git'е прилагаю: git://git.altlinux.org/people/sin/packages/service.git commit de446eb9424f69f6a727b78f6c4581b69a082068 Author: Evgeny Sinelnikov <sin@altlinux.ru> Date: Sun Oct 30 07:20:27 2011 +0400 rc.d/init.d/functions: add support --background option of start-stop-daemon diff --git a/service/rc.d/init.d/functions b/service/rc.d/init.d/functions index 294e7e7..9ff70ce 100644 --- a/service/rc.d/init.d/functions +++ b/service/rc.d/init.d/functions @@ -103,6 +103,7 @@ start_daemon() EXPECT= LOCKFILE= MAKE_PIDFILE= + BACKGROUND= NICE=0 PIDFILE= SU= @@ -139,6 +140,10 @@ start_daemon() shift MAKE_PIDFILE='--background --make-pidfile' ;; + --background) + shift + BACKGROUND='--background' + ;; --name) shift CMDNAME="$1" @@ -197,7 +202,8 @@ start_daemon() FLAGS="$FLAGS --startas $WHICH --name $CMDNAME" [ -z "$PIDFILE" ] || FLAGS="$FLAGS --pidfile $PIDFILE" [ -z "$EXPECT" ] || FLAGS="$FLAGS --user $EXPECT" - [ -z "$MAKE_PIDFILE" ] || FLAGS="$FLAGS $MAKE_PIDFILE" + [ -n "$MAKE_PIDFILE" ] && FLAGS="$FLAGS $MAKE_PIDFILE" || + [ -z "$BACKGROUND" ] || FLAGS="$FLAGS $BACKGROUND" # Is it running at all? if ! start-stop-daemon $FLAGS --test > /dev/null; then
OK, добавлю, но не как альтернативу --make-pidfile, т.е. --background можно будет использовать вместе с --make-pidfile, и это будет эквивалентно --make-pidfile.
service-0.5.22-alt1 -> sisyphus: * Thu Jan 26 2012 Dmitry V. Levin <ldv@altlinux> 0.5.22-alt1 - start-stop-daemon: implemented support of /proc/%d/exe pointing to names with " (deleted)" prefix. - minilogd: changed to create /dev/log socket world writable (closes: #12564). - init.d/functions (UnmountFilesystems): implemented mountpoints decoding to match getmntent(3) behaviour (closes: #17118). - init.d/functions (start_daemon): + added --background option (closes: #26529); + added --check option. - service.8: imported from Fedora (closes: #22166).
Что-то не так добавил. --background добавляется по умолчанию. в скрипте вызывается: start () { start_daemon --make-pidfile --pidfile "$PIDFILE" --lockfile "$LOCKFILE" --name "$PROG" -- $PROG RETVAL=$? return $RETVAL } В итоге происходит следующее: [root@riderkvm64 ~]# start-stop-daemon --start -N 0 --startas /usr/sbin/php5-fpm --name php5-fpm --pidfile /var/run/php5-fpm/php5-fpm.pid --background --make-pidfile [root@riderkvm64 ~]# echo $? 0 А на самом деле, если убрать опцию background: [root@riderkvm64 ~]# start-stop-daemon --start -N 0 --startas /usr/sbin/php5-fpm --name php5-fpm --pidfile /var/run/php5-fpm/php5-fpm.pid --make-pidfile [10-Feb-2012 13:14:05] ALERT: [pool www] pm.min_spare_servers(5) and pm.max_spare_servers(10) cannot be greater than pm.max_children(5) [10-Feb-2012 13:14:05] ERROR: failed to post process the configuration [10-Feb-2012 13:14:05] ERROR: FPM initialization failed [root@riderkvm64 ~]# echo $? 255
(In reply to comment #3) > Что-то не так добавил. --background добавляется по умолчанию. > в скрипте вызывается: > start () > { > start_daemon --make-pidfile --pidfile "$PIDFILE" --lockfile "$LOCKFILE" > --name "$PROG" -- $PROG > RETVAL=$? > return $RETVAL > } В части --make-pidfile поведение не изменилось, см. http://git.altlinux.org/gears/s/..git?p=service.git;a=commitdiff;h=0.5.21-alt1-6-gba768fd
а почему код возврата не отслеживается ? Или так и раньше было, а я просто этого не замечал ?
В части --make-pidfile поведение не изменилось, --background использовался и раньше, в этом режиме код возврата недоступен. См. тж. start-stop-daemon(8) на тему --background.