Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-05-01 00:19:18

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Systemd, konfiguracja usług

Na samym początku chciałbym się upewnić czy dobrze rozumiem oznaczenia w systemd. W plikach oraz w nazwach usług są min. takie znaczki:
%I -- w plikach usług .service
@ -- w nazwach plików .service

Odpaliłem pierwszy lepszy plik usługi który miał w nazwie @ -- dhcpcd@eth0.service i spróbowałem go przeanalizować.

Kod:

[Unit]
Description=dhcpcd on %I
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
Type=forking
PIDFile=/run/dhcpcd-%I.pid
ExecStart=/usr/sbin/dhcpcd -q -w %I
ExecStop=/usr/sbin/dhcpcd -x %I

[Install]
WantedBy=multi-user.target

Włączając usługę wydawałem polecenie systemctl enable dhcpcd@eth0.service . W pliku usługi jest PIDFile poszukałem w katalogu /run wskazówek -- plik dhcpcd-eth0.pid

Czyli jeśli się nie mylę %I odpowiada za to co się wpisze po @ w nazwie usługi. Są jakieś inne parametry, o których powinienem wiedzieć?

Teraz tak, z tego co ustaliłem, pulseaudio można odpalać na 3 różne sposoby:

Kod:

/usr/bin/pulseaudio -D
/usr/bin/pulseaudio --start
/usr/bin/start-pulseaudio-x11

Przy czym ten ostatni plik wygląda tak:

Kod:

#!/bin/sh

# This file is part of PulseAudio.
#
# PulseAudio is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# PulseAudio is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with PulseAudio; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
# USA.

set -e

/usr/bin/pulseaudio --start "$@"

if [ x"$DISPLAY" != x ] ; then

    /usr/bin/pactl load-module module-x11-publish "display=$DISPLAY" > /dev/null
    #/usr/bin/pactl load-module module-x11-cork-request "display=$DISPLAY" > /dev/null

    if [ x"$SESSION_MANAGER" != x ] ; then
    /usr/bin/pactl load-module module-x11-xsmp "display=$DISPLAY session_manager=$SESSION_MANAGER" > /dev/null
    fi
fi

Stworzyłem zatem pliki:

Kod:

root:/etc/systemd/system# cat suspend@.service 
[Unit]
Description=User suspend actions
Before=sleep.target 

[Service]
User=%I
Environment=DISPLAY=:0
Type=oneshot
ExecStart= /usr/bin/pulseaudio -k
ExecStart= /usr/bin/xscreensaver-command --lock

[Install]
WantedBy=sleep.target

oraz

Kod:

root:/etc/systemd/system# cat resume@.service
[Unit]
Description=User resume actions
After=suspend.target

[Service]
User=%I
Environment=DISPLAY=:0
Type=oneshot
ExecStart= /usr/bin/start-pulseaudio-x11

[Install]
WantedBy=suspend.target

Włączyłem usługi:

Kod:

root:/etc/systemd/system# systemctl enable resume@morfik.service 
ln -s '/etc/systemd/system/resume@.service' '/etc/systemd/system/suspend.target.wants/resume@morfik.service'
root:/etc/systemd/system# systemctl enable suspend@morfik.service 
ln -s '/etc/systemd/system/suspend@.service' '/etc/systemd/system/sleep.target.wants/suspend@morfik.service'

Reset ale jak zwykle coś nie działa. xD

Zacząłem testować usługę suspend@.service ręcznie:

Kod:

root:/etc/systemd/system# systemctl start suspend@morfik.service
Job for suspend@morfik.service failed. See 'systemctl status suspend@morfik.service' and 'journalctl -xn' for details.
root:/etc/systemd/system# systemctl status suspend@morfik.service
suspend@morfik.service - User suspend actions
   Loaded: loaded (/etc/systemd/system/suspend@.service; enabled)
   Active: failed (Result: exit-code) since Tue 2013-04-30 23:09:08 CEST; 14s ago
  Process: 5186 ExecStart=/usr/bin/pulseaudio -k (code=exited, status=1/FAILURE)

Apr 30 23:09:08 morfina pulseaudio[5186]: E: [pulseaudio] main.c: Failed to kill daemon: No such process
Apr 30 23:09:08 morfina systemd[1]: suspend@morfik.service: main process exited, code=exited, status=1/FAILURE
Apr 30 23:09:08 morfina systemd[1]: Failed to start User suspend actions.
Apr 30 23:09:08 morfina systemd[1]: MESSAGE=Unit suspend@morfik.service entered failed state.
root:/etc/systemd/system# journalctl -xn
-- Logs begin at Sun 2013-04-28 00:14:17 CEST, end at Tue 2013-04-30 23:09:08 CEST. --
Apr 30 23:09:08 morfina systemd[1]: Starting User suspend actions...
-- Subject: Unit suspend@morfik.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit suspend@morfik.service has begun starting up.
Apr 30 23:09:08 morfina pulseaudio[5186]: E: [pulseaudio] main.c: Failed to kill daemon: No such process
Apr 30 23:09:08 morfina systemd[1]: suspend@morfik.service: main process exited, code=exited, status=1/FAILURE
Apr 30 23:09:08 morfina systemd[1]: Failed to start User suspend actions.
-- Subject: Unit suspend@morfik.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- Documentation: http://www.freedesktop.org/wiki/Software/systemd/catalog/be02cf6855d2428ba40df7e9d022f03d
-- 
-- Unit suspend@morfik.service has failed.
-- 
-- The result is failed.
Apr 30 23:09:08 morfina systemd[1]: MESSAGE=Unit suspend@morfik.service entered failed state.

Edytowałem zatem plik suspend@.service i wykomentowałem wpis od pulseaudio, zostawiając tam tylko polecenie blokady pulpitu, następnie:

Kod:

root:/etc/systemd/system# systemctl --system daemon-reload 
root:/etc/systemd/system# systemctl start suspend@morfik.service
root:/etc/systemd/system# systemctl status suspend@morfik.service
Apr 30 23:14:56 morfina systemd[1]: Starting User suspend actions...
Apr 30 23:14:57 morfina xscreensaver-command[5802]: xscreensaver-command: activating and locking.
Apr 30 23:14:57 morfina systemd[1]: Started User suspend actions.

Widać zatem, że problem jest w linijce od pulse -- ExecStart= /usr/bin/pulseaudio -k

W logu można było przeczytać, że Failed to kill daemon: No such process pomimo faktu, że proces istniał. Więc co mu nie pasuje?

Kod:

root:/etc/systemd/system# ps -eo "user args" | grep pulse
morfik   /usr/bin/pulseaudio --start
morfik   /usr/lib/pulse/gconf-helper
root     grep --color=auto pulse

Ubijając jednak pulse jako zwykły user, wszystko jest ok:

Kod:

morfik:~$ /usr/bin/pulseaudio -k
root:/etc/systemd/system# ps -eo "user args" | grep pulse
root     grep --color=auto pulse

Spróbowałem ubić pulse z roota i odpalić go jaki zwykły user:

Kod:

root:/etc/systemd/system# pulseaudio -k
root:/etc/systemd/system# ps -eo "user args" | grep pulse
root     grep --color=auto pulse
morfik:~$ /usr/bin/start-pulseaudio-x11
E: [autospawn] core-util.c: Failed to create secure directory (/run/user/1000/pulse): Permission denied
W: [autospawn] lock-autospawn.c: Cannot access autospawn lock.
E: [pulseaudio] main.c: Failed to acquire autospawn lock

Zajrzałem zatem pod /run/user/1000/pulse :

Kod:

root:/run/user/1000# ls -al
total 0
drwx------ 4 morfik morfik 100 Apr 30 22:36 ./
drwxr-xr-x 5 root   root   100 Apr 30 22:43 ../
drwx------ 2 root   root   100 Apr 30 23:20 pulse/
drwxr-xr-x 2 morfik morfik  60 Apr 30 22:43 systemd/
lrwxrwxrwx 1 root   root    17 Apr 30 22:36 X11-display -> /tmp/.X11-unix/X0=

Zmienił się owner. Także to polecenie ubicia musi być wykonane ze zwykłego usera, który potem ma odpalić pulse. Przywróciłem ownera i zresetowałem pulse.

Ok, to może ta usługa za bardzo nie działa, zobaczmy jak pójdzie z drugą -- resume@morfik.service

Ubiłem pulse ręcznie by zasymulować warunki w których odpalana będzie usługa po hibernacji:

Kod:

morfik:~$ /usr/bin/pulseaudio -k
morfik:~$ ps -eo "user args" | grep pulse
morfik   grep --color=auto pulse
root:/etc/systemd/system# systemctl start resume@morfik.service
root:/etc/systemd/system# systemctl status resume@morfik.service
resume@morfik.service - User resume actions
   Loaded: loaded (/etc/systemd/system/resume@.service; enabled)
   Active: inactive (dead) since Tue 2013-04-30 23:32:09 CEST; 2s ago
  Process: 7183 ExecStart=/usr/bin/start-pulseaudio-x11 (code=exited, status=0/SUCCESS)

Apr 30 23:32:06 morfina systemd[1]: Starting User resume actions...
Apr 30 23:32:06 morfina pulseaudio[7187]: [pulseaudio] sink.c: Default and alternate sample rates are the same.
Apr 30 23:32:06 morfina pulseaudio[7187]: [pulseaudio] source.c: Default and alternate sample rates are the same.
Apr 30 23:32:09 morfina systemd[1]: Started User resume actions.

Błędów nie ma

Kod:

morfik:~$ ps -eo "user args" | grep pulse
morfik   grep --color=auto pulse

Procesu też -- WTF? xD

Nie mam pojęcia co robię źle. Wiem, że zaraz się sporo ludzi rzuci, żeby olać pulse i pewnie w niedługim okresie to zrobię, ale niezbyt miło zostawiać nierozwiązane problemy. xD

Na początku były problemy z:

Kod:

Apr 30 23:37:35 morfina pulseaudio[7896]: [pulseaudio] sink.c: Default and alternate sample rates are the same.
Apr 30 23:37:35 morfina pulseaudio[7896]: [pulseaudio] source.c: Default and alternate sample rates are the same.
Apr 30 23:37:35 morfina pulseaudio[7896]: [pulseaudio] module-jackdbus-detect.c: Unable to contact D-Bus session bus: org.freedesktop.D... for X11
Apr 30 23:37:35 morfina pulseaudio[7896]: [pulseaudio] module.c: Failed to load module "module-jackdbus-detect" (argument: ""): initial... failed.
Apr 30 23:37:35 morfina pulseaudio[7896]: [pulseaudio] main.c: Module load failed.
Apr 30 23:37:35 morfina pulseaudio[7896]: [pulseaudio] server-lookup.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupporte... for X11
Apr 30 23:37:35 morfina pulseaudio[7896]: [pulseaudio] main.c: Unable to contact D-Bus: org.freedesktop.DBus.Error.NotSupported: Unable... for X11
Apr 30 23:37:35 morfina pulseaudio[7896]: [pulseaudio] module-gconf.c: Unable to read or parse data from client

Ale po dodaniu  Environment=DISPLAY=:0 do pliku usługi problem znikł.

Odpalając usługę resume@morfik.service mając wpisane pulseaudio -D, w logu widnieją poniższe komunikaty:

Kod:

root:/etc/systemd/system# systemctl --system daemon-reload 
root:/etc/systemd/system# systemctl start resume@morfik.service
root:/etc/systemd/system# systemctl status resume@morfik.service
resume@morfik.service - User resume actions
   Loaded: loaded (/etc/systemd/system/resume@.service; enabled)
   Active: inactive (dead) since Tue 2013-04-30 23:57:54 CEST; 5s ago
  Process: 9607 ExecStart=/usr/bin/pulseaudio -D (code=exited, status=0/SUCCESS)

Apr 30 23:57:51 morfina systemd[1]: Starting User resume actions...
Apr 30 23:57:51 morfina pulseaudio[9609]: [pulseaudio] sink.c: Default and alternate sample rates are the same.
Apr 30 23:57:51 morfina pulseaudio[9609]: [pulseaudio] source.c: Default and alternate sample rates are the same.
Apr 30 23:57:51 morfina pulseaudio[9609]: [pulseaudio] module-gconf.c: Unable to read or parse data from client.
Apr 30 23:57:54 morfina systemd[1]: Started User resume actions.

Wpadło mi do głowy jeszcze pytanie -- czym się różni pulseaudio -D od pulseaudio --start .

Kod:

  -D, --daemonize[=BOOL]                Daemonize after startup
--start                           Start the daemon if it is not running

Czyli na dobrą sprawę to jest to samo. :] Jakieś pomysły?

Offline

 

#2  2013-05-01 09:45:37

  dominbik - Członek DUG

dominbik
Członek DUG
Zarejestrowany: 2011-07-25

Re: Systemd, konfiguracja usług

[quote=morfik]Spróbowałem ubić pulse z roota i odpalić go jaki zwykły user:[/quote]
Możesz odpalić pulseaudio z roota jako zwykły user przez:

Kod:

su $user -c $komenda

gdzie $user i $komenda odpowiednio zmieniasz. Tutaj jeszcze odnośnie systemd;
https://wiki.archlinux.org/index.php/Systemd
https://wiki.archlinux.org/index.php/Systemd/Services

odnośnie podstawowych czynności z usługami: https://wiki.archlinux.org/index.php/Systemd#Using_units
odnośnie znaku "@" - nie wiem, ja jak włączam usługę po znaczku @ zwykle daje jakiś argument dla włączanej aplikacji. Na przykład: "systemctl start netctl@mojasiec". Tyle znalazłem:
[i]"Optionally, if the absolute file name is prefixed with '@', the second token will be passed as argv[0] to the executed process, followed by the further arguments specified. If the absolute file name is prefixed with '-' an exit code of the command normally considered a failure (i.e. non-zero exit status or abnormal exit due to signal) is ignored and considered success. If both '-' and '@' are used they can appear in either order."[/i]

Na twoim miejscu zrezygnowałbym po prostu z pulseaudio. Po co Ci to?


[img]http://img34.imageshack.us/img34/5092/zw9m.png[/img] [img]http://img29.imageshack.us/img29/219/pibw.png[/img]

Offline

 

#3  2013-05-01 10:17:49

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Systemd, konfiguracja usług

Tutaj nie chodzi o pulseaudio, tylko o zresetowanie (zastopowanie i uruchomienie) usługi via systemd jako określony użytkownik. Pulse to tylko kozioł ofiarny. xD

W unicie jest User=%I co to oznacza? Za co odpowiada User w tych plikach?

Czytam sobie: http://www.freedesktop.org/software/systemd/man/systemd.unit.html —  tam na dole jest tabelka z parametrami. xD

%i    Instance name    For instantiated units: this is the string between the @ character and the suffix.
%I    Unescaped instance name[/quote]
Czyli dobrze mi się wydawało. Wpisując coś po @, będzie można się odwołać do tego przez %i albo %I. Czyli jak mam usługę np. resume@morfik.service to %I = morfik A że jest user=%I to user=morfik , tylko co taki zapis oznacza.

To wygląda ciekawie:

%u    User name    This is the name of the configured user of the unit, or (if none is set) the user running the systemd instance.[/quote]
Czyli? xD

Przeglądając usługi pod https://wiki.archlinux.org/index.php/Systemd/Services dochodzę do wniosku, że User=%I wcale chyba nie oznacza odpalania usługi jako określony user, ciekawe zatem co oznacza. I na dobrą sprawę nie wiem jak mam rozumieć taki zapis: ExecStart=/usr/bin/truecrypt --filesystem=none %I

EDIT:

Jednak %I odpowiada za usera i polecenia w usłudze są wykonywane jako określony w pliku .service user. Pytanie zatem, czemu po starcie albo ubiciu pulse nic się nie zmienia. Tylko to stoi na przeszkodzie.

Ostatnio edytowany przez morfik (2013-05-01 11:16:54)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.006 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00009 SET CHARSET latin2
0.00005 SET NAMES latin2
0.00073 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.14.249.124' WHERE u.id=1
0.00057 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.14.249.124', 1732629212)
0.00038 SELECT * FROM punbb_online WHERE logged<1732628912
0.00039 SELECT topic_id FROM punbb_posts WHERE id=231454
0.00004 SELECT id FROM punbb_posts WHERE topic_id=23440 ORDER BY posted
0.00041 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=23440 AND t.moved_to IS NULL
0.00008 SELECT search_for, replace_with FROM punbb_censoring
0.00077 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=23440 ORDER BY p.id LIMIT 0,25
0.00140 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=23440
Total query time: 0.00491 s