Mam skrypt do spania uruchamiany cron
przy uruchamianiu. Skrypt budzi się co minutę i ustawia jasność wyświetlacza laptopa na podstawie wschodu i zachodu słońca uzyskanego z Internetu. Konfigurowalna przez użytkownika faza przejścia między pełnym rozjaśnieniem a pełnym przyciemnieniem wymaga zwiększania i zmniejszania wartości o 3, 4, 5 lub cokolwiek obliczanego co minutę.
Oli krótko poruszył pstree
swoją odpowiedź, ale odrzucił ją, ponieważ zabiłoby to wszystkie sleep
przypadki. Można tego uniknąć, zawężając wyszukiwanie za pomocą opcji pstree.
Używając pstree -h
widzimy całą heirarchię:
$ pstree -h
systemd─┬─ModemManager─┬─{gdbus}
│ └─{gmain}
├─NetworkManager─┬─dhclient
│ ├─dnsmasq
│ ├─{gdbus}
│ └─{gmain}
├─accounts-daemon─┬─{gdbus}
│ └─{gmain}
├─acpid
├─agetty
├─atd
├─avahi-daemon───avahi-daemon
├─cgmanager
├─colord─┬─{gdbus}
│ └─{gmain}
├─cron───cron───sh───display-auto-br───sleep
├─cups-browsed─┬─{gdbus}
│ └─{gmain}
├─dbus-daemon
├─fwupd─┬─3*[{GUsbEventThread}]
│ ├─{fwupd}
│ ├─{gdbus}
│ └─{gmain}
├─gnome-keyring-d─┬─{gdbus}
│ ├─{gmain}
│ └─{timer}
├─irqbalance
├─lightdm─┬─Xorg───3*[{Xorg}]
│ ├─lightdm─┬─upstart─┬─at-spi-bus-laun─┬─dbus-daemon
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─at-spi2-registr─┬─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─bamfdaemon─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ └─{gmain}
│ │ │ ├─chrome─┬─2*[cat]
│ │ │ │ ├─chrome─┬─chrome─┬─2*[chrome─┬─{Chrome_ChildIOT}]
│ │ │ │ │ │ │ ├─5*[{CompositorTileW}]]
│ │ │ │ │ │ │ ├─{Compositor}]
│ │ │ │ │ │ │ ├─{GpuMemoryThread}]
│ │ │ │ │ │ │ ├─{MemoryInfra}]
│ │ │ │ │ │ │ ├─{Renderer::FILE}]
│ │ │ │ │ │ │ ├─{TaskSchedulerRe}]
│ │ │ │ │ │ │ └─{TaskSchedulerSe}]
│ │ │ │ │ │ ├─7*[chrome─┬─{Chrome_ChildIOT}]
│ │ │ │ │ │ │ ├─5*[{CompositorTileW}]]
│ │ │ │ │ │ │ ├─{Compositor}]
│ │ │ │ │ │ │ ├─{GpuMemoryThread}]
│ │ │ │ │ │ │ ├─{MemoryInfra}]
│ │ │ │ │ │ │ ├─{Renderer::FILE}]
│ │ │ │ │ │ │ ├─{ScriptStreamerT}]
│ │ │ │ │ │ │ ├─{TaskSchedulerRe}]
│ │ │ │ │ │ │ └─{TaskSchedulerSe}]
│ │ │ │ │ │ ├─chrome─┬─{Chrome_ChildIOT}
│ │ │ │ │ │ │ ├─5*[{CompositorTileW}]
│ │ │ │ │ │ │ ├─{Compositor}
│ │ │ │ │ │ │ ├─{GpuMemoryThread}
│ │ │ │ │ │ │ ├─{Media}
│ │ │ │ │ │ │ ├─{MemoryInfra}
│ │ │ │ │ │ │ ├─{Renderer::FILE}
│ │ │ │ │ │ │ ├─{ScriptStreamerT}
│ │ │ │ │ │ │ ├─{TaskSchedulerRe}
│ │ │ │ │ │ │ └─{TaskSchedulerSe}
│ │ │ │ │ │ └─2*[chrome─┬─{Chrome_ChildIOT}]
│ │ │ │ │ │ ├─5*[{CompositorTileW}]]
│ │ │ │ │ │ ├─{Compositor}]
│ │ │ │ │ │ ├─{GpuMemoryThread}]
│ │ │ │ │ │ ├─{Renderer::FILE}]
│ │ │ │ │ │ ├─{ScriptStreamerT}]
│ │ │ │ │ │ ├─{TaskSchedulerRe}]
│ │ │ │ │ │ └─{TaskSchedulerSe}]
│ │ │ │ │ └─nacl_helper
│ │ │ │ ├─chrome─┬─chrome
│ │ │ │ │ ├─{Chrome_ChildIOT}
│ │ │ │ │ ├─{MemoryInfra}
│ │ │ │ │ ├─{TaskSchedulerSe}
│ │ │ │ │ └─{Watchdog}
│ │ │ │ ├─{AudioThread}
│ │ │ │ ├─{BrowserWatchdog}
│ │ │ │ ├─{Chrome_CacheThr}
│ │ │ │ ├─{Chrome_DBThread}
│ │ │ │ ├─{Chrome_FileThre}
│ │ │ │ ├─{Chrome_FileUser}
│ │ │ │ ├─{Chrome_HistoryT}
│ │ │ │ ├─{Chrome_IOThread}
│ │ │ │ ├─{Chrome_ProcessL}
│ │ │ │ ├─{Chrome_SyncThre}
│ │ │ │ ├─{CompositorTileW}
│ │ │ │ ├─{CrShutdownDetec}
│ │ │ │ ├─{D-Bus thread}
│ │ │ │ ├─{Geolocation}
│ │ │ │ ├─{IndexedDB}
│ │ │ │ ├─{LevelDBEnv}
│ │ │ │ ├─{MemoryInfra}
│ │ │ │ ├─{NetworkChangeNo}
│ │ │ │ ├─{Networking Priv}
│ │ │ │ ├─4*[{TaskSchedulerBa}]
│ │ │ │ ├─6*[{TaskSchedulerFo}]
│ │ │ │ ├─{TaskSchedulerSe}
│ │ │ │ ├─{WorkerPool/3166}
│ │ │ │ ├─{WorkerPool/5824}
│ │ │ │ ├─{WorkerPool/5898}
│ │ │ │ ├─{WorkerPool/6601}
│ │ │ │ ├─{WorkerPool/6603}
│ │ │ │ ├─{WorkerPool/7313}
│ │ │ │ ├─{chrome}
│ │ │ │ ├─{dconf worker}
│ │ │ │ ├─{extension_crash}
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ ├─{gpu-process_cra}
│ │ │ │ ├─{inotify_reader}
│ │ │ │ ├─{renderer_crash_}
│ │ │ │ ├─{sandbox_ipc_thr}
│ │ │ │ └─{threaded-ml}
│ │ │ ├─compiz─┬─{dconf worker}
│ │ │ │ ├─{gdbus}
│ │ │ │ ├─{gmain}
│ │ │ │ └─8*[{pool}]
│ │ │ ├─conky───6*[{conky}]
│ │ │ ├─2*[dbus-daemon]
( .... many lines deleted to fit in 30k limit .... )
├─vnstatd
├─whoopsie─┬─{gdbus}
│ └─{gmain}
└─wpa_supplicant
Jak widać typowy login Ubuntu zawiera wiele wielu identyfikatorów PID (ID procesów).
Możemy zawęzić go do naszego działającego skryptu, używając:
$ pstree -g -p | grep display-auto
|-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(26552,1308)
Widzimy:
cron
uruchomił powłokę (identyfikator procesu 1308 i identyfikator sesji 1308)
- Powłoka wywołuje nasz program działający pod identyfikatorem procesu 1321 i identyfikatorem sesji 1308 (pasującym do powłoki)
- Nasz program wywołuje
sleep
proces o numerze ID 26552 i ponownie o sesji o numerze 1308
W tym momencie możemy użyć pkill -s 1308
i zabiłoby to całą sesję, która zawiera powłokę, nasz program display-auto-brightness
i sleep
polecenie. Zamiast tego użyjemy kill 26552
tylko do zabicia polecenia uśpienia, co zmusi nasz program do przebudzenia i dostosowania jasności.
Wpisując to ręcznie w terminalu zobaczysz:
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
|-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(32362,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ sudo kill 32362
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
|-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(1279,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ sudo kill 1279
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$ pstree -g -p | grep display-auto
|-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(4440,1308)
───────────────────────────────────────────────────────────────────────────────
rick@dell:~$
Następnym krokiem jest zrobienie tego, gdy laptop budzi się z zawieszenia. Na przykład po zamknięciu pokrywy było całkowicie ciemno, a jasność ekranu ustawiono na „300”. Po otwarciu pokrywy jest światło dzienne, a jasność należy ustawić na „2000”. Oczywiście program sam się obudzi w ciągu 1 do 59 sekund, ale wygodniej jest natychmiast ustawić jasność.
Po napisaniu opublikuję kod zawieszenia / wznowienia. Mam nadzieję, że w ten weekend.