Cegah mesin dari tidur ketika koneksi SSH sedang aktif

13

Saya mencoba menghemat daya dengan mengalihkan desktop ke mode menangguhkan saat tidak aktif. Tetapi banyak desktop juga diakses melalui SSH oleh pemiliknya. Ada solusi wakeonlan yang digunakan untuk memungkinkan pemilik menghidupkan mesin, tetapi masalahnya adalah bahwa mesin akan ditangguhkan lagi secara otomatis dalam 10 menit, meskipun koneksi SSH aktif.

Apa yang saya coba lakukan adalah memasukkan sesi SSH aktif dalam definisi "aktivitas".

Pertanyaannya, dapatkah hal ini dilakukan melalui pengaturan aturan polkit? Bisakah itu dilakukan dengan meletakkan skrip yang berjalan sebelum penangguhan yang sebenarnya, dan membatalkannya jika sesi SSH ditemukan? Saya perlu cara yang sah dan bersih untuk melakukan ini. Jika tidak, maka cara hack juga diterima.

Solusi peretasan naif saat ini: edit /usr/sbin/pm-suspend:

#check for SSH sessions, and prevent suspending:
if [ "$(who | grep -cv "(:")" -gt 0 ]; then
    echo "SSH session(s) are on. Not suspending."
    exit 1
fi

Ini melayani tujuan. Tapi saya tidak tahu kapan pembaruan akan menimpa file /usr/sbin/pm-suspend. Saya juga tidak tahu bagaimana ini akan bekerja dengan implementasi menangguhkan lainnya seperti tuxonice.

Bhavin Doshi
sumber
2
Bolehkah saya menyarankan menggunakan grep -cv :0daripada melewati wc?
terdon
1
Gagasan lain untuk keanggunan yang lebih: Anda dapat membatalkan doa [jika Anda menulis if who | grep -qv :0; then(dengan asumsi Anda memiliki POSIX yang sesuai grepseperti GNU grep).
David Foerster

Jawaban:

19

Hingga Ubuntu 14.10 (Berbasis pemula)

Lihat pm-action(8)dan cari /etc/pm/sleep.ddi bagian "FILES". Jika salah satu skrip ini kembali dengan status keluar non-nol, penangguhan dicegah.

Petunjuk yang diperbarui untuk kejelasan:

  1. Jadi buat file /etc/pm/sleep.d/05_ssh_keepawake.

  2. Letakkan shebang ( #!/bin/sh) dan kode yang disebutkan dalam pertanyaan di file ini.

  3. Tetapkan eksekusi izin di atasnya:

    chmod +x /etc/pm/sleep.d/05_ssh_keepawake
    

Sejak Ubuntu 15.04 (berbasis sistemd)

systemd tidak menggunakan pm-utils untuk mengelola hook-nya, tetapi memiliki infrastruktur sendiri untuk tujuan yang sama. Checker inhibitor tidur tidak lagi dijalankan saat tidur tetapi harus diatur oleh tindakan yang menghambat tidur (lihat 1 ).

Karena itu, Anda harus menambahkan perintah ke sesi SSH masuk dan keluar yang mendaftarkan sleep inhibitor dengan systemd (misalnya via systemd-inhibit(1)) dan kemudian melepaskan inhibitor. Jika ada yang tahu cara menghubungkan ke SSH masuk dan keluar, saya akan menyambut komentar atau edit sehingga kami bisa mengetahui langkah-langkah dan perintah yang relevan.

Bagian berikut sedang dalam proses - Hanya gunakan saat Anda tahu apa yang Anda lakukan!

Anda mungkin bisa menulis unit systemd /etc/systemd/system/ssh-inhibt-sleep.serviceyang menjadikan dirinya ketergantungan sleep.targetmenggunakan RequiredByopsi. Jika unit baru Anda gagal (dengan status keluar non-nol dari proses yang diminta), itu akan membuat sleep.targetdan dengan demikian tindakan tidur berikutnya.

[Unit]
Description=Check for running SSH sessions and, if any, inhibit sleep
Before=sleep.target

[Service]
Type=oneshot
ExecStart=/bin/sh -c '! who | grep -qv :0'`

[Install]
RequiredBy=sleep.target

Seperti biasa Anda perlu mengaktifkan unit systemd agar mereka berlaku:

sudo systemctl enable ssh-inhibt-sleep.service

Untuk info lebih lanjut, lihat systemd.unit(5)dan systemd.service(5).

David Foerster
sumber
ini sepertinya tidak berfungsi di 18.04. Apakah ini bukan lagi solusinya?
Michael Jarret
1
@MichaelJarret: Memang. Saya memperbarui pertanyaan saya dengan beberapa info tentang situasi dengan systemd.
David Foerster
Saya menemukan yang berikut saat mencoba menyelesaikan masalah ini kemarin, tetapi tidak dapat memodifikasi skrip sebelumnya untuk melakukan pekerjaan di sini
Michael Jarret
Saya tidak dapat mengedit komentar saya, tetapi juga ini tampaknya relevan
Michael Jarret
1
@MichaelJarret: Saya punya ide lain yang bisa Anda coba. Lihat pembaruan untuk jawaban saya.
David Foerster