Bug 26529 - Опция --background в init-скриптах
: Опция --background в init-скриптах
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/service)
: unstable
: all Linux
: P3 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2011-10-30 06:47 by
Modified: 2016-07-11 21:59 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


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