Bug 26529

Summary: Опция --background в init-скриптах
Product: Sisyphus Reporter: Evgeny Sinelnikov <sin>
Component: serviceAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P3 CC: glebfm, lav, ldv, legion, placeholder, rider
Version: unstable   
Hardware: all   
OS: Linux   

Description Evgeny Sinelnikov 2011-10-30 06:47:26 MSK
В ряде случаев, когда программа умеет создавать 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
Comment 1 Dmitry V. Levin 2012-01-26 02:51:41 MSK
OK, добавлю, но не как альтернативу --make-pidfile, т.е. --background можно будет использовать вместе с --make-pidfile, и это будет эквивалентно --make-pidfile.
Comment 2 Repository Robot 2012-01-27 01:31:13 MSK
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).
Comment 3 Anton Farygin 2012-02-10 13:18:54 MSK
Что-то не так добавил. --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
Comment 4 Dmitry V. Levin 2012-02-10 14:26:46 MSK
(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
Comment 5 Anton Farygin 2012-02-10 16:25:37 MSK
а почему код возврата не отслеживается ? Или так и раньше было, а я просто этого не замечал ?
Comment 6 Dmitry V. Levin 2012-02-10 21:29:27 MSK
В части --make-pidfile поведение не изменилось, --background использовался и раньше, в этом режиме код возврата недоступен.
См. тж. start-stop-daemon(8) на тему --background.