Ho avviato uno script bash dormiente cron
. Lo script si sveglia ogni minuto e imposta la luminosità del display del laptop in base all'alba e al tramonto ottenuti da Internet. Una fase di transizione configurabile dall'utente tra la piena luminosità e la piena oscurità richiede un aumento e una riduzione dei valori di 3, 4, 5 o qualsiasi cosa venga calcolata ogni minuto.
Oli accennò brevemente alla pstree
sua risposta, ma la respinse perché avrebbe ucciso tutti i sleep
casi. Questo può essere evitato restringendo la ricerca usando le opzioni pstree.
Usando pstree -h
vediamo l'intera erirarchia:
$ 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
Come puoi vedere, un tipico login di Ubuntu contiene molti PID (Process ID).
Possiamo limitarlo al nostro script in esecuzione usando:
$ pstree -g -p | grep display-auto
|-cron(1198,1198)---cron(1257,1198)---sh(1308,1308)---display-auto-br(1321,1308)---sleep(26552,1308)
Vediamo:
cron
avviato una shell (ID processo 1308 e ID sessione 1308)
- La shell chiama il nostro programma in esecuzione con ID processo 1321 e ID sessione 1308 (corrispondente alla shell)
- Il nostro programma chiama
sleep
con ID processo 26552 e di nuovo ID sessione 1308
A questo punto possiamo usare pkill -s 1308
e ucciderebbe l'intera sessione che include la shell, il nostro programma display-auto-brightness
e il sleep
comando. Invece useremo kill 26552
per uccidere solo il comando sleep costringendo il nostro programma a svegliarsi e regolare la luminosità.
Digitando questo manualmente nel terminale si vede:
───────────────────────────────────────────────────────────────────────────────
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:~$
Il prossimo passo è farlo quando il laptop si sveglia dalla sospensione. Ad esempio, quando il coperchio era chiuso, era completamente buio e la luminosità dello schermo era impostata su "300". Quando il coperchio è aperto, è la luce del giorno e la luminosità deve essere impostata su "2000". Ovviamente il programma si risveglierebbe da solo in 1-59 secondi, ma è più comodo impostare la luminosità all'istante.
Pubblicherò il codice di sospensione / ripresa dopo che è stato scritto. Spero che questo fine settimana.