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/.
Strony: 1
Próbuję sobie przekierować komunikaty z pliku ~/.xsession-errors do urządzenia FIFO. Chodzi o to, że raz, ten plik mi się rozrasta po wgraniu SDDM (chyba na lightdm był czyszczony co restart graficznej sesji), a dwa, chciałbym sobie te logi wrzucić na konsolę na pulpit, gdzie mam również wszystkie pozostałe logi, również przy zastosowaniu urządzeń FIFO.
W pliku /etc/X11/Xsession jest coś na wzór:
ERRFILE=$HOME/.xsession-errors ... exec >>"$ERRFILE" 2>&1
Próbowałem sobie dodać coś w stylu:
ERRFILE=/dev/log-xsession-errors exec >>"$ERRFILE" 2>&1
ale to wiesza mi start Openboxa (bez znaczenia czy dodam sobie te linijki w pliku /etc/X11/Xsession czy w autostarcie Openbox'a).
Jak sobie wrzuciłem oba te powyższe wpisy bezpośrednio na konsolę, to tylko ten pierwszy jest uruchamiany w tle, ten drugi zaś wisi w terminalu i dlatego sesja nie chce wystartować.
Próbowałem dodać sobie zatem & na końcu, czyli:
ERRFILE=/dev/log-xsession-errors exec >>"$ERRFILE" 2>&1 &
I w tym przypadku sesja startuje ale logów w urządzeniu brak. Da radę to jakoś ogarnąć czy nie bardzo? xD
Offline
Dobra udało się ale nie wiem czy nie ma prostszej metody. xD
Generalnie, to chciałem sobie stworzyć urządzenie FIFO za pomocą tego mechanizmu systemd-tmpfiles, bo tak sobie to wcześniej ogarnąłem z rsyslog. Ale w tym przypadku to nie zadziała, bo to wieszanie terminala czy sesji jest uzależnione od odczytu tego urządzenia FIFO — jak jakiś inny proces, np. cat, odczyta to urządzenie, to wszystko już pójdzie z płatka ale problemem jest odpalenie czegokolwiek w skrypcie po wywołaniu [b]exec >>"$ERRFILE" 2>&1 [/b]. xD Dlatego te urządzenia FIFO trzeba stworzyć inaczej — przez mechanizm socket'ów (też tych z systemd). No i napisałem sobie dwa pliki:
# cat /etc/systemd/system/log-xsession-errors.socket [Unit] Description=log-xsession-errors socket DefaultDependencies=no Before=sockets.target PartOf=log-xsession-errors.service [Socket] ListenFIFO=/dev/log-xsession-errors SocketMode=0600 SocketUser=morfik SocketGroup=morfik RemoveOnStop=true PipeSize=1M [Install] WantedBy=sockets.target
oraz
# cat /etc/systemd/system/log-xsession-errors.service [Unit] Description=log-xsession-errors service DefaultDependencies=no [Service] ExecStart=/bin/true RemainAfterExit=yes [Install] Also=log-xsession-errors.socket
W zasadzie ten plik .socket określa sobie urządzenie FIFO i tworzy je praktycznie na starcie systemu (szybciej chyba nawet niż ten mechanizm tworzenia plików tymczasowych). Uprawnienia są nadawane, więc jest tak jak powinno być. Z kolei ten .socket wymaga usługi do działania, to mu stworzyłem najprostszą jaką można, która zawsze zwraca TRUE i nic innego nie robi. xD A RemainAfterExit jest po to by ta usługa nie była wywoływana wiele razy. Chodzi generalnie o to, że jeśli wrzucę to poniższe
ERRFILE=/dev/log-xsession-errors exec >>"$ERRFILE" 2>&1
do skryptu Xsession albo do autostaru Openbox'a, to każda wiadomość przesłana na urządzenie FIFO będzie próbowała odpalić tę usługę, a że ona bardzo szybko się zakończy, to po chwili uderzy w limit uruchomień w konkretnej jednostce czasu. A tak to się ona uruchomi i system oznaczy ją jako działającą i nie będzie musiał odpalać jej ponownie.
Te powyższe dwie linijki dodałem sobie do /etc/X11/Xsession , bo chcę mieć wszystkie komunikaty sesji a nie tylko samego autostartu Openboxa. Trzeba też było wykomentować pewne rzeczy i całość wygląda to mniej więcej tak:
... #ERRFILE=$HOME/.xsession-errors # ## attempt to create an error file; abort if we cannot #if (umask 077 && touch "$ERRFILE") 2> /dev/null && [ -w "$ERRFILE" ] && # [ ! -L "$ERRFILE" ]; then # chmod 600 "$ERRFILE" #elif ERRFILE=$(tempfile 2> /dev/null); then # if ! ln -sf "$ERRFILE" "${TMPDIR:=/tmp}/xsession-$USER"; then # message "warning: unable to symlink \"$TMPDIR/xsession-$USER\" to" \ # "\"$ERRFILE\"; look for session log/errors in" \ # "\"$TMPDIR/xsession-$USER\"." # fi #else # errormsg "unable to create X session log/error file; aborting." #fi # #exec >>"$ERRFILE" 2>&1 export ERRFILE=/dev/log-xsession-errors exec >>"$ERRFILE" 2>&1 ...
No i moja konsola teraz ma dodatkowego tab'a a w nim komunikaty sesji Xserver'a, co wygląda mniej więcej tak:
[img]https://i.imgur.com/aRnSpWa.png[/img]
Jak ktoś ma inny pomysł jak ogarnąć te urządzenia FIFO i logi z sesji, to jestem ciekaw. xD
Ostatnio edytowany przez morfik (2018-04-06 14:34:00)
Offline
Ja się poddałem z analizą ~/.xsession-errors :)
Zrobiłem link, który kończy się w ramdysku
/home/urbinek/.xsession-errors -> /tmp/xsession-errors
Ostatnio edytowany przez urbinek (2018-04-05 09:58:53)
Offline
Ja tam lubię ten plik, sporo rzeczy można za jego sprawą poprawić, choć w ogóle tam nie zaglądałem. xD U mnie teraz też te logi są trzymane w RAM, choć może samo urządzenie FIFO ma niewielką kolejkę ale w terminalu mam kolo 10K linii historii, i koło 1 MiB chyba te logi max będą u mnie zajmować, no i są czyszczone z każdym restartem graficznej sesji.
Offline
A jak zrobisz na chama linka np /dev/mojezajebistefifo do ~/.xsession_eroors to nie zapisuje błędów?
Offline
Nie działa. Nawet jak się cat'a zapuści na TTY na to urządzenie, to jak tylko się odpali sesję graficzną, to cat dostaje po łbie ze kodem wyjścia 130, no i oczywiście nie ma żadnych komunikatów. Jak się ponownie podepnie cat'em pod urządzenie, to i tak żadnych wiadomości nie ma.
Co ciekawe, na Openbox te sokety działają i bez problemu mi tutaj wszystko się odpala ale KDE/Plasma5 z nimi się już nie chce odpalić, a przecie ten sam SDDM startuje X. xD
Ostatnio edytowany przez morfik (2018-04-05 22:20:19)
Offline
Już wiem czemu KDE/Plasma5 ma problemy z wystartowaniem -- to urządzenie FIFO ma za mały bufor. Po prostu na Openbox jest sporo mniej wiadomości, które trzeba podczas startu systemu przesłać do urządzenia FIFO, podczas gdy na KDE/Plasma5 jest to ~100 KiB (póki co), a wiesza się przy 92-93 KiB (~1600 linii). Na szczęście ten parametr też można skonfigurować.
[Socket] .. PipeSize=1M
I już startuje wszystko ładnie. xD
Pytanie tylko, jaki rozmiar ma kolejka FIFO, gdy nie konfiguruje się tego urządzenia przez systemd? No i też jak zwiększyć jej rozmiar? Bo pewnie to by rozwiązało problem. Choć jeszcze muszę popatrzeć jak to wygląda z gołymi urządzeniami FIFO i może da radę coś wymyśleć. xD
Offline
Wygląda jednak na to, że tego się nie da zrobić w taki sposób jak chciałem, przynajmniej jeśli chodzi o sposób bez systemd. Generalnie to te urządzenia FIFO trzeba otworzyć przed ich zapisem, inaczej nie chcą działać. xD Systemd je otwiera sobie i później buforuje komunikaty aż jakiś inny proces je podbierze sobie.
EDIT:
Przy okazji się wyjaśniło jakim cudem mi ten rsyslog działa z FIFO bez problemu, bo jak patrzyłem pod TTY, czy jest otwierane urządzenie FIFO, gdy np. router chce mi wysłać z sieci wiadomości na kompa, i się okazało, że nie ale po za logowaniu się do systemu, to wiadomości na konsolę trafiają, no tylko podobnie jak ten mechanizm soketów w systemd, rsyslog też ma swój bufor i jak tylko się da "cat" na urządzenie FIFO, to rsyslog przesyła te wiadomości od razu, czyli tak samo działa jak systemd ale wymagane jest ręczne zainicjowanie odczytania urządzenia. xD
https://www.rsyslog.com/doc/rsconf1_mainmsgqueuesize.html
Ostatnio edytowany przez morfik (2018-04-06 19:17:36)
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00013 | SET CHARSET latin2 |
0.00006 | SET NAMES latin2 |
0.00136 | 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.221.52.77' WHERE u.id=1 |
0.00092 | UPDATE punbb_online SET logged=1732178415 WHERE ident='18.221.52.77' |
0.00050 | SELECT * FROM punbb_online WHERE logged<1732178115 |
0.00065 | DELETE FROM punbb_online WHERE ident='3.145.78.117' |
0.00094 | 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=30401 AND t.moved_to IS NULL |
0.00009 | SELECT search_for, replace_with FROM punbb_censoring |
0.00191 | 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=30401 ORDER BY p.id LIMIT 0,25 |
0.00103 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=30401 |
Total query time: 0.00759 s |