Вопрос: Скрипт Upstart для демона передачи, выполняемый как обычный пользователь


Я сделал сценарий для запуска демона передачи как обычного пользователя:

start on filesystem
stop on runlevel [!2345]

respawn
respawn limit 10 5

pre-start script
    test -x /usr/bin/transmission-daemon || { stop; exit 0; }
    test -d /home/user/.config/transmission-daemon || { stop; exit 0; }
end script

exec su -l -c 'transmission-daemon --foreground --config-dir /home/user/.config/transmission-daemon --logfile /home/user/.config/transmission-daemon/daemon.log' user

Этот скрипт работает, но я вижу два процесса при выполнении демона передачи:

user     5041  0.0  0.0  48556  1516 ?        Ss   01:10   0:00 su -l -c transmission-daemon --foreground --config-dir /home/user/.config/transmission-daemon --logfile /home/user/.config/transmission-daemon/daemon.log user
user     5048  0.5  0.0 150432  2960 ?        Sl   01:10   0:00 transmission-daemon --foreground --config-dir /home/user/.config/transmission-daemon --logfile /home/user/.config/transmission-daemon/daemon.log

Это верно? Есть ли другой способ сделать это лучше?

Заметка: Стандартный сценарий запуска пакета передачи отключен,

Больше информации:

Если я выполняю передачу как демона (без foreground) проблема заключается в обнаружении PID с помощью init:

start on filesystem
stop on runlevel [!2345]

expect fork

pre-start script
    test -x /usr/local/bin/transmission-daemon || { stop; exit 0; }
    test -d /home/mario/.config/transmission-daemon || { stop; exit 0; }
end script

exec sudo -u user transmission-daemon --config-dir /home/user/.config/transmission-daemon --logfile /home/user/.config/transmission-daemon/daemon.log

,

$ sudo initctl list | grep trans
trans-test start/running, process 3110

но на самом деле это PID sudo (готовый процесс), идентификатор PID передачи-передачи:

$ ps aux 
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
user     3148  0.0  0.0 154848  2708 ?        Ssl  13:33   0:00 transmission-daemon 

4
2017-07-06 23:15


Источник


Правильно ли я предполагаю, что вы уже знаете об этом и отключили сценарий запуска System V, который установленный по умолчанию? - ændrük
Да, сценарий запуска по умолчанию отключен, и этот скрипт не запускает демона передачи с помощью foreground, - Juan Simón


Ответы:


Итак, решение - запустить демон передачи на переднем плане (нет ожиданий fork или daemon) и что start-stop-daemon создает файл pid.
Полный скрипт:

description "Transmission daemon for user"

start on (local-filesystems and net-device-up IFACE=eth0 and runlevel [235])
stop on runlevel [016]

kill timeout 50

respawn

env USER=user
env PIDFILE=/var/run/transmission-user.pid

script
    DAEMON=$(which transmission-daemon) || exit 0
    CONFIGDIR=/home/$USER/.config/transmission-daemon

    exec start-stop-daemon --start --quiet --chuid $USER --pidfile $PIDFILE --make-pidfile --exec $DAEMON -- -f --config-dir $CONFIGDIR --logfile $CONFIGDIR/daemon.log
end script

post-stop exec rm -f $PIDFILE

2
2017-10-23 01:15





С помощью --foreground правильно - вы хотите выскочить, чтобы отслеживать ход вашего процесса передачи. Опустить --foreground Добавить expect daemon в конфигурацию init, которая будет следовать за двумя вилками процесса, а именно, как обезопасить службы.

С помощью start-stop-daemon является субоптимальным, поскольку выскочка не может наблюдать за вашим процессом и респанировать его по мере необходимости в случае аварии и т. д.

Вот моя конфигурация:

start on (runlevel [2345] and filesystem and networking)
stop on runlevel [!2345]

respawn
kill timeout 30

setuid transmission

exec /usr/bin/transmission-daemon --foreground --config-dir /var/lib/transmission

2
2018-03-24 11:25





Когда вы запускаете приложение с su -c, su будет ждать завершения приложения. В вашем случае, добавив --foreground вариант, сделать передачу, чтобы не отсоединиться от ее родителя. Итак, вы увидите su как родительский процесс transimssion-daemon за все время жизни.

Если вы удалите этот параметр, вы увидите, что su процесс прекратится, как только transmission-daemon идет на задний план.

Помимо удаления этой опции, которая кажется неподходящей для службы, я предлагаю использовать

sudo -u <your-user> app-name options

вместо su, будучи ближе к способу Ubuntu делать вещи и быть более простым в управлении опциями без необходимости использования одинарных кавычек.


1
2017-07-07 11:13



Но если я подавляю foreground, init обнаруживает неправильный PID процесса. Он сохраняет PID sudo но sudo закончен: initctl: trans-test start/running, process 3110 но процесс имеет другой PID: user 3148 0.0 0.0 154848 2708 ? Ssl 13:33 0:00 transmission-daemon - Juan Simón
Непроверенная альтернатива может заключаться в том, чтобы получить право собственности на исполняемый файл (sudo chown $USER:$USER /usr/bin/transmission-daemon), затем сделайте его setuid (chmod u+s /usr/bin/transmission-daemon). - enzotib
Спасибо, но это не работает для меня. Tranmission будет выполняться дважды с разными пользователями. - Juan Simón
Выполнено дважды, и с разными пользователями, кроме того, очень странно - enzotib
Да, один передатчик-демон для каждого пользователя системы. - Juan Simón


Моя версия:

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

# give time to send info to trackers
kill timeout 30

expect fork
respawn

script
        USER=debian-transmission
        test -f /etc/default/transmission-daemon && . /etc/default/transmission-daemon
        test "$ENABLE_DAEMON" != "0" || exit 0
        exec start-stop-daemon --start --quiet --chuid $USER --exec /usr/bin/transmission-daemon -- $OPTIONS
end script

Вок хорош:

root@ubuntu-server:/etc/init# status transmission-daemon
transmission-daemon start/running, process 754
root@ubuntu-server:/etc/init# ps aux|grep [t]ransmission-daemon
torrent    754  0.0  1.1  41592  5596 ?        Ssl  Oct21   0:56 /usr/bin/transmission-daemon --auth --config-dir /var/lib/transmission-daemon/info

-1
2017-10-22 13:09



Этот скрипт мне не подходит: transmission-simon start/running, process 5880 но процесс 5880 не существует. Я думаю, что upstart принимает PID команды start-stop-daemon вместо демона передачи. - Juan Simón