Malŝalti komputilon post fino de procezo

Okaze ni volas malŝalti la komputilon, sed ni estas plenumanta taskon (ekzemple elŝuton, ĝisdatigon, ktp.). Ni povas atendi ĝian finon por malŝalti la komputilon mane aŭ ni povas diri al la komputilo, ke ĝi malŝaltu sin, kiam la procezo finu. En ĉi tiu artikolo mi montras kiel fari la aŭtomatan solvon.

Ĉi tiu artikolo povas esti danĝera, se vi kopias la komandon mane kaj eraras, ĉar vi povas malŝalti la komputilon. Mi rekomendas legi kaj kompreni la instruojn ĉi tie montritajn antaŭ kopii ilin laŭlitere.

Ni supozu, ke ni komencis elŝuton per la programo wget kaj ni scias, ke la elŝuto finos proksimume post unu horo. Ni povus do programi la malŝaltadon de la komputilo post unu horo per la komando shutdown +60, kvankam ĉiam estas rekomendinda lasi iom pli da tempo.

Ĉi tiu solvo havas gravan problemon: se iel la tasko prokrastas, povas esti, ke la elŝuto ne finu. Por solvi ĉi tiun problemon, ni malŝaltos la komputilon, kiam la tasko finu.

Al ĉiu tasko apartenas proceza identigilo (mallongigite PID). Por atingi la procezan nombron de programo, ni povas uzi la pgrep-komandon, donante al ĝi kiel argumento la nomon de la programo.

$ pgrep wget
3204

La programo liveras la elirstaton 0 (sukceso) kaj montras la rezulton de la plenumado (3204). Se estas neniu plenumanta procezo, kiu enhavas la ĉenon wget, pgrep liveras la elirstaton 1.

Poste ni skribos while-iteracion por kontroli, se pgrep liveras 0 kiel elirstato ĉiun kvinan sekundon. Se ĝi ne faras tion, ni malŝaltos la komputilon. En la malsupra kodo ni uzas la listan operacion ||. La komando antaŭ || ĉiam plenumos; la malantaŭa nur plenumos, se la antaŭa fiaskas. Ĉar pgrep montras la komandan eligon ekrane kaj mi ne volas vidi ĝin ĉiun kvinan sekundon, mi alidirektas ĝin al /dev/null per > (tio forigas ĝin).

while true; do
    pgrep wget > /dev/null || shutdown now
    sleep 5
done

Se oni plenumas ĉi tiujn komandojn kelkfoje, estas rekomendinde programi skripton, kiu povas ricevi argumenton por specifi la programon, kiun ni volas kontroli.

La antaŭa metodo havas problemon en kazoj, kiam pgrep liveras pli ol unu rezulto, sed oni povas solvi ĝin kontrolante nur la procezan identigilon, pri kiu ni estas interesitaj kaj kontrolante, ke ĝi ankoraŭ plenumas. Ni supozu, ke ni nur volas halti la procezon kun la identigilo 1091 en la jenaj ekzemploj.

Ni povas kontroli, se procezo ankoraŭ plenumas analizante la eligon de la ps-programo per la opcio -q kaj la proceza nombro kiel ĝia argumento.

while true; do
    ps -q 1091 > /dev/null || shutdown now
    sleep 5
done

En GNU/Linukso, la procezoj kreas dosierujon, kies nomo estas la procezidentigilo, en la dosierujo /proc/. Tio estas al la procezo kun la identigilo 1091 atribuas la dosiero /proc/1019. Kiam la procezo finas, tiu dosiero malaperos.

while true; do
    test -d /proc/1091 || shutdown now
    sleep 5
done

Per ambaŭ antaŭaj metodoj estas simple programi la malŝaltadon de la komputilo post fino de tasko. Kvankam ne estas tre probabla, konsideru, ke iu nova procezo povus preni la identigilon de la procezo de la kontrolita programo — ekzemple tio eblas per la integrita en Bash exec-komando.

Komentoj