Apakah mungkin untuk membangunkan proses yang dijeda menggunakan sleep
perintah?
Sebagai contoh, katakanlah Anda memiliki skrip ini:
#!/bin/bash
echo "I am tired"
sleep 8h
echo "I am fresh :)"
Setelah 30 menit Anda menemukan bahwa Anda memerlukan script untuk berhenti, yaitu, Anda berharap telah menulis sleep 30m
sebagai gantinya.
Anda tidak ingin memanggil kill PID
atau menekan Ctrl+ C, karena perintah terakhir tidak dijalankan dan Anda akan tetap lelah.
Apakah ada cara untuk membangunkan proses dari sleep
atau mungkin menggunakan perintah lain yang mendukung wakeup? Solusi untuk proses latar belakang dan latar depan dipersilakan.
command-line
bash
Bittenus
sumber
sumber
gawk
sekali tidak bekerja. Terakhir kali saya memilikisleep
proses, sayapushd
turun dari tempat tidur.#!
baris. Dan itu penting karena jawaban untuk pertanyaan Anda tergantung pada apakah ada-e
yang#!
sesuai.#!/bin/bash -e
, skrip akan berhenti setelah kesalahan. Cukup membunuh perintah tidur akan diperlakukan sebagai kesalahan oleh bash. Itu berarti tanpa-e
ada jawaban yang cukup sederhana untuk pertanyaan Anda. Jika-e
digunakan, maka itu menjadi jauh lebih sulit karena Anda harus menghentikan proses tidur tanpa membunuhnya.Jawaban:
Saat skrip Bash menjalankan
sleep
, inilah yangpstree
akan terlihat seperti:Keduanya memiliki ID proses (PID), bahkan saat dijalankan sebagai skrip. Jika kami ingin mengganggu tidur, kami akan mengirim
kill 8506
dan sesi Bash akan dilanjutkan ... Masalahnya adalah di lingkungan yang dituliskan skrip kami tidak tahu PID darisleep
perintah dan tidak ada manusia untuk melihat prosesnya pohon.Kita bisa mendapatkan PID dari sesi Bash melalui
$$
variabel ajaib. Jika kita dapat menyimpannya di suatu tempat, kita dapat menargetkan contohsleep
yang berjalan di bawah PID itu. Inilah yang saya masukkan ke dalam skrip:Dan kemudian kita bisa mengatakan
pkill
kepadasleep
contoh nuklir yang menjalankan di bawah PID itu:Sekali lagi, ini membatasi dirinya hanya untuk
sleep
proses yang berjalan langsung di bawah satu sesi Bash. Selama PID dicatat dengan benar, ini membuatnya jauh lebih aman daripadakillall sleep
ataupkill sleep
, yang dapat membatalkan proses apa punsleep
pada sistem (izin memungkinkan).Kita dapat membuktikan teori itu dengan contoh berikut di mana kita memiliki tiga sesi bash terpisah, dua running
sleep
. Hanya karena kami menetapkan PID dari sesi bash kiri atas, hanyasleep
itu yang terbunuh.Pendekatan alternatif adalah mendorong
sleep
ke latar belakang, menyimpan PID dan kemudian mengembalikannya ke latar depan. Dalam skrip:Dan untuk membunuhnya:
sumber
Anda dapat menulis skrip Anda untuk menangani ("menjebak") sinyal lain dari kill dll sehingga Anda dapat memodifikasi perilaku skrip sesuai kebutuhan. Lihat bash man:
sumber
Anda bisa mematikan tidur yang akan berlanjut ke baris script berikutnya:
Perhatikan bahwa ini akan membunuh proses tidur yang berjalan di sistem Anda, tidak hanya di skrip Anda.
sumber
Saya memiliki skrip bash tidur yang dimulai
cron
saat boot. Script bangun setiap menit dan mengatur kecerahan tampilan laptop berdasarkan matahari terbit dan terbenam yang diperoleh dari internet. Fase transisi yang dapat dikonfigurasi pengguna antara kecerahan penuh dan redup penuh memerlukan peningkatan dan penurunan nilai sebesar 3, 4, 5 atau apa pun yang dihitung setiap menit.Oli dengan singkat menyinggung
pstree
jawabannya tetapi menolaknya karena itu akan membunuh semuasleep
contoh. Ini dapat dihindari dengan mempersempit pencarian menggunakan opsi pstree.Dengan menggunakan
pstree -h
kita melihat seluruh heirarki:Seperti yang Anda lihat login khas Ubuntu berisi banyak PID (ID Proses).
Kami dapat mempersempitnya ke skrip kami yang sedang berjalan menggunakan:
Kami melihat:
cron
memulai sebuah shell (ID proses 1308 dan sesi ID 1308)sleep
dalam ID proses 26552 dan lagi sesi ID 1308Pada titik ini kita dapat menggunakan
pkill -s 1308
dan itu akan mematikan seluruh sesi yang meliputi shell, program kitadisplay-auto-brightness
dansleep
perintah. Sebagai gantinya kita akan menggunakankill 26552
hanya untuk membunuh perintah tidur memaksa program kita untuk bangun dan menyesuaikan kecerahan.Mengetik ini secara manual di terminal yang Anda lihat:
Langkah selanjutnya adalah melakukannya ketika laptop bangun dari menangguhkan. Misalnya ketika tutupnya tertutup, layarnya gelap gulita dan kecerahan layar ditetapkan "300". Ketika tutup dibuka itu siang hari dan kecerahan perlu diatur ke "2000". Tentu saja program akan bangun sendiri dalam 1 hingga 59 detik tetapi lebih nyaman untuk kecerahan diatur secara instan.
Saya akan memposting kode penangguhan / resume setelah ditulis. Semoga akhir pekan ini.
sumber