1

Temat: [mało znane pakiety] pservice

W repozytorium OpenWrt można znaleźć się setki pakietów. Niektóre są mało znane, choć realizują ciekawe funkcje. Jednym z nich jest pservice.

Wielu (a zwłaszcza początkujących) użytkowników często zadaje pytanie "jak uruchomić własny program przy starcie systemu"? O ile pakiet jest dostosowany do OpenWrt to zwykle zawiera już skrypty startowe, ale jeżeli to jest nasz własny skrypt lub mamy tylko program w postaci binarki to z pomocą przyjdzie nam pakiet pservice - skrypt pozwalający na uruchamianie poleceń wykorzystujący mechanizm obecny w OpenWrt tzw procd.

Ale po co to?

Oczywiście pservice jest opcjonalny - bardziej zaawansowani użytkownicy mogą napisać swój własny skrypt startowy, ci mniej - mogą użyć np. /etc/rc.local do tego celu. Jednakże sprawa się komplikuje kiedy nie chcemy tylko uruchomić procesu ale także pilnować czy on działa i restartować go jak się wyłączy czy jak zostanie zmieniony jakiś plik. Te wszystkie mechanizmy zapewnia procd, więc nie musimy się nimi zajmować samodzielnie.

Instalacja
# opkg update
# opkg install pservice
# /etc/init.d/pservice enable
Konfiguracja

Interesuje nas plik /etc/config/pservice. Są w w nim zawarte dwa proste przykłady dobrze opisujące możliwe do ustawienia parametry:

config pservice
    option disabled 0
    option name 'demo0'
    option command /bin/sh
    option respawn_maxfail 0
    list args -c
    list args 'env | logger -t $name; exec sleep $time'
    list env 'v0=0'
    list env 'v1=val with space'
    list env 'name=demo0'
    list env 'time=1799'
    list file /tmp/sleep.conf

Dla każdego programu który chcemy uruchomić tworzymy nową sekcję typu pservice. Nadajemy mu jakąś nazwę (name), koniecznie ustawiamy disabled na 0 (jeżeli ma być włączone i się uruchamiać), w command podajemy program do uruchomienia lub - dla skryptów - /bin/sh. Reszta jest opcjonalna i zależy co chcemy przekazać do programu:
- list args: argumenty przekazywane do programu (dla skryptów dajemy -c oraz dalej nazwę skryptu)
- list env: zmienne środowiskowe jeżeli jakieś muszą być
- list file: lista plików których zmiana powoduje restart serwisu

O innych parametrach można przeczytać na oryginalnej stronie projektu: https://github.com/yousong/waller/tree/ … e/pservice

Po konfiguracji pamiętajmy o restarcie routera lub po prostu włączeniu serwisu:

# /etc/init.d/pservice start
Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.

2

Odp: [mało znane pakiety] pservice

Fajny projekt. Szkoda, że praktycznie nierozwijany. Przydałoby się możliwość ustawienia nice (priorytetu) oraz użytkownika/grupy tak by usługa nie musiała działać na koncie root'a.

Tak przy okazji napotkałem problem ze skryptem shellowym który ustawiłem jako usługę (procd). Mój skrypt zawiera taką konstrukcję:

mpc idleloop | while read -r line; do
...
done

To powoduje, że powstają dwa procesy potomne: jeden to mpc idleloop a drugi to fork shella wykonujący pętlę while read. Gdy uruchamiam skrypt z konsoli a potem przerywam jego działanie przez CTRL+C wszystko jest w porządku - główny proces jak i procesy potomne zwyczajnie kończą swoją działalność. Ale gdy skrypt jest uruchamiany jako usługa to tylko proces główny kończy działalność ale pozostają procesy potomne. Wspomina o tym autor pservice ale nie pokazuje jak sobie radzić z procesami potomnymi w skrypcie shellowym. Myślałem o własnej obsłudze sygnałów ale wygląda na to, że handlery sygnałów są przez procd w jakiś sposób blokowane. Tak więc nie mam pojęcia jak ugryźć ten problem.

3

Odp: [mało znane pakiety] pservice

Sam procd ma ma możliwość ustawienia usera/grupy, więc jak chcesz coś dodać to po prostu zrób łatkę i podeślij jako PR, niech dodadzą to.

Masz niepotrzebny router, uszkodzony czy nie - chętnie przygarnę go.