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
Witam!
gdy wpisuje w emulatorze terminala (urxvt);
root@stacjonarny:~# xprintidle No protocol specified couldn't open display
dominbik@stacjonarny:~$ xprintidle 4
można jakoś uruchomić spod roota jako użytkownik lub ustawić ten 'display'?
potrzebne mi to, by ten skrypcik wykrywający idle działał w cronie od roota;
ale brał wartość xidle od usera (bo na roocie xów nie uruchamiam)
#!/bin/bash polecenie=$* while [ $(bash /usr/share/silnik/uzycie_cpu.sh) -ge 10 ] || [ $(xprintidle) -le 20000 ]; do sleep 50; done $polecenie
Ostatnio edytowany przez dominbik (2012-05-26 14:35:44)
Offline
w KDE jest do tego kdesu, a w Gnome gksu, ale nie wiem czy zadziała w tym skrypcie
mam u siebie zrobiony taki myk z sudo i kdesu, który umożliwia uruchomienie aplikacji jako root bez podawania hasła i np. u mnie daje to taki wynik:
davidoski@debian:~$ sudo kdesu xprintidle Error: "/var/tmp/kdecache-davidoski" is owned by uid 1000 instead of uid 0. 131 davidoski@debian:~$ xprintidle 3
Ten error można usunąć, ale nie chciało mi się nigdy z tym walczyć, bo w zasadzie niczemu nie szkodzi. Nie wiem czy o to ci chodzi.
Ostatnio edytowany przez davidoski (2012-05-26 15:46:54)
Offline
dominbik napisał(-a):
Kod:
root@stacjonarny:~# xprintidle No protocol specified couldn't open display
W środowisku roota nie ma zmiennej określającej klucz, za pomocą którego może autoryzować się w serwerze X.
Jak radzi davidoski, użyj gksu czy innego sux do uruchomienia terminala. A najlepiej su-to-root z pakietu menu.
dominbik napisał(-a):
potrzebne mi to, by ten skrypcik wykrywający idle działał w cronie od roota;
ale brał wartość xidle od usera (bo na roocie xów nie uruchamiam)Kod:
#!/bin/bash polecenie=$* while [ $(bash /usr/share/silnik/uzycie_cpu.sh) -ge 10 ] || [ $(xprintidle) -le 20000 ]; do sleep 50; done $polecenie
Tutaj masz dwa czynniki. Jednym jest to, o czym pisałeś wyżej (problemy z autoryzacją). Drugim jest to, że cron nie ma pojęcia, jakiego DISPLAY ma użyć, gdyż zmienna ta jest ustawiana podczas uruchamiania X.
Z tego co pamiętam, wystarczy ustawić zmienną DISPLAY w cronie aby móc z jego poziomu podejmować interakcje ze środowiskiem graficznym.
Pozostaje jeszcze kwestia autoryzacji superużytkownika. Skoro skrypt jest uruchamiany jako root, możesz bez problemu wywoływać polecenia jako użytkownik (su <login> -c) — upewnij się tylko, że zmienna DISPLAY na poziomie użytkownika jest ustawiona (o ile dobrze pamiętam, że tyle wystarczy).
Masz też inne rozwiązania:
1. Uruchamiać cały skrypt jako użytkownik, a ewentualne polecenia które wymagają uprawnień administracyjnych uruchamiać przez odpowiednio skonfigurowane sudo. Ten sposób wybrałem ja w swoim skrypcie do backupów (a jeśli się nie mylę, Twój skrypt również ma wykonywać backupy).
2. Dodać sobie skrypt, który będzie działał cały czas, kiedy uruchomiony jest serwer X; powinien on w nieskończonej pętli co jakiś czas (5-10 sekund) uruchamić polecenie xprintidle i wynik zapisywać w jakimś pliku tymczasowym. Skrypt uruchamiany z crona przez roota będzie sobie odczytywał wartość z tego pliku. To rozwiązanie, dobrze zaimplementowane, będzie działać z automatu dla wszystkich sesji X uruchomionych przez różnych użytkowników. Będzie również odporne na dodawanie nowych i usuwanie dotychczasowych użytkowników z systemu.
Przy okazji: Twoja pętla najprawdopodobniej (nie sprawdzałem) się wywali, jeżeli żaden serwer X nie jest uruchomiony (nie wiem co wtedy zwraca xprintidle, ale zapewne jest to ciąg znaków, którego powłoka nie będzie potrafiła porównać z liczbą przy żądaniu porównania arytmetycznego).
davidoski napisał(-a):
Ten error można usunąć, ale nie chciało mi się nigdy z tym walczyć
To jest kwestia przekierowania wyjścia błędu do /dev/null. Ponieważ z rzadka może mieć to niepożądane konsekwencje, można kompromisowo wyjście błędu przekierować do pliku w /tmp/.
Offline
Minio napisał(-a):
Z tego co pamiętam, wystarczy ustawić zmienną DISPLAY w cronie aby móc z jego poziomu podejmować interakcje ze środowiskiem graficznym.
próbowałem przez
env DISPLAY=:0 xprintidle > /home/dominbik/test
lecz nie dawało rezultatu zarówno w cron jak i konsoli. zauważyłem, że po xhost + działa
ale z tego co wiem wyłączanie tego nie jest bezpieczne.
Skoro skrypt jest uruchamiany jako root, możesz bez problemu wywoływać polecenia jako użytkownik (su <login> -c) — upewnij się tylko, że zmienna DISPLAY na poziomie użytkownika jest ustawiona (o ile dobrze pamiętam, że tyle wystarczy).
o to chodziło! działa z włączonym zabezpieczeniem xhost i bez kombinacji. w emulatorze terminala (w normalnych terminalach nie działa)
su nazwa_usera -c xprintidle
- działa również w tty1, tty2 itd...
env DISPLAY=:0 su nazwa_usera -c xprintidle
- mam nadzieję, że dodatkowo zadziała przy każdym użytkowniku (zwykle działa jeden na Xach).
env DISPLAY=:0 su `users | awk '{ print $1}'` -c xprintidle
1. Uruchamiać cały skrypt jako użytkownik, a ewentualne polecenia które wymagają uprawnień administracyjnych uruchamiać przez odpowiednio skonfigurowane sudo. Ten sposób wybrałem ja w swoim skrypcie do backupów (a jeśli się nie mylę, Twój skrypt również ma wykonywać backupy).
tak myślałem o tym jako ostateczność.
2. Dodać sobie skrypt, który będzie działał cały czas, kiedy uruchomiony jest serwer X; powinien on w nieskończonej pętli co jakiś czas (5-10 sekund) uruchamić polecenie xprintidle i wynik zapisywać w jakimś pliku tymczasowym. Skrypt uruchamiany z crona przez roota będzie sobie odczytywał wartość z tego pliku. To rozwiązanie, dobrze zaimplementowane, będzie działać z automatu dla wszystkich sesji X uruchomionych przez różnych użytkowników. Będzie również odporne na dodawanie nowych i usuwanie dotychczasowych użytkowników z systemu.
też o tym myślałem, lecz ostatnio napisałem sobie kilka skryptów i niektóre problemy próbowałem właśnie na różne sposoby obchodzić - ostatecznie wolę stawiać na najprostsze rozwiązania. nawet zastanawiałem się czy nie lepiej wykorzystać statyczne uruchamianie backupu niż pisać ten skrypt.
Przy okazji: Twoja pętla najprawdopodobniej (nie sprawdzałem) się wywali, jeżeli żaden serwer X nie jest uruchomiony (nie wiem co wtedy zwraca xprintidle, ale zapewne jest to ciąg znaków, którego powłoka nie będzie potrafiła porównać z liczbą przy żądaniu porównania arytmetycznego).
tak. będę musiał dać warunek, że jeżeli user ma włączone Xy xprintidle zostanie wywołane. lecz póki co zastanawiam się jak to zrobić z pomocą ps. dodatkowo będę musiał jeszcze coś dopisać, bo zdarza się, że mnie nie ma, xscreensaver blokuje komputer/hibernuje - ktoś siada do komputera i daje przy pytaniu o hasło xscreensavera "New Login". wtedy xscreensaver klepie
X -query moje_ip
i są tak jakby dwa Xy jednocześnie na F7 i F8 przy pomoc xdmcp.
Ostatnio edytowany przez dominbik (2012-05-26 20:41:47)
Offline
jeżeli na użytkowniku który używa obecnie Xów walnę xhost+ to działa. lecz ta metoda odpada całkowicie. użyję;
env DISPLAY=:0 su `users | awk '{ print $1}'` -c xprintidle
chodź i tak będę musiał opakować to w skrypt do sprawdzający ile Xów uruchomionych oraz czy ktoś ma włączone Xy (dla menadżera logowania xprintidle nie działa)
Ostatnio edytowany przez dominbik (2012-05-26 23:04:48)
Offline
jbc zrobiłem wkońcu tak ten skrypcik wykrycia idle dla backupa:
http://pastebin.com/raw.php?i=T9C5sRmZ
Ostatnio edytowany przez dominbik (2012-06-02 11:06:57)
Offline
Strony: 1