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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
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ć.
[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:
/usr/bin/pulseaudio -D /usr/bin/pulseaudio --start /usr/bin/start-pulseaudio-x11
Przy czym ten ostatni plik wygląda tak:
#!/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:
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
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:
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:
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:
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?
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:
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:
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 :
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:
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
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:
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:
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 .
-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
[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:
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?
Offline
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
Time (s) | Query |
---|---|
0.00109 | SET CHARSET latin2 |
0.00028 | SET NAMES latin2 |
0.00161 | 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='18.226.214.91' WHERE u.id=1 |
0.00099 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.226.214.91', 1732621443) |
0.00072 | SELECT * FROM punbb_online WHERE logged<1732621143 |
0.00239 | DELETE FROM punbb_online WHERE ident='85.208.96.203' |
0.00104 | 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.00005 | SELECT search_for, replace_with FROM punbb_censoring |
0.00145 | 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.00076 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=23440 |
Total query time: 0.01038 s |