Saya memiliki server yang biasanya dimatikan karena alasan keamanan. Ketika saya ingin mengerjakannya, saya mengaktifkannya, menjalankan tugas saya, dan mematikannya lagi. Tugas saya biasanya memakan waktu tidak lebih dari 15 menit. Saya ingin menerapkan mekanisme untuk mematikannya secara otomatis setelah 60 menit.
Saya telah meneliti bagaimana melakukan ini dengan cron, tapi saya rasa itu bukan cara yang tepat karena cron tidak memperhitungkan ketika server terakhir kali dihidupkan. Saya hanya bisa mengatur pola periodik, tetapi mereka tidak memperhitungkan data itu.
Bagaimana saya bisa melakukan implementasi ini?
at
(eksekusi satu kali).sudo shutdown -h +60
yang akan memulai penghitung mundur 60 menit untuk proses shutdown (-halt). Jika Anda ingin membatalkannya, Anda bisasudo shutdown -c
(ini tidak menggunakan cron)Jawaban:
Jika Anda menjalankan tugas Anda sebagai pengguna yang sama setiap kali, Anda cukup menambahkan perintah shutdown, secara opsional dengan opsi -P, ke profil Anda. Jumlahnya adalah jumlah menit perintah shutdown tertunda. Pastikan pengguna Anda memiliki kemampuan untuk menjalankan perintah shutdown melalui sudo tanpa kata sandi.
sumber
shutdown -k -P 3600
vsshutdown -k -P 60
(-k
mencetak pesan dinding tetapi tidak memiliki efek lain)Ada beberapa opsi.
Berikan waktu langsung ke
shutdown -P
:Perhatikan bahwa
shutdown
halaman manual juga menunjukkan:Gunakan
at
perintah.Buat file unit systemd atau skrip init yang berjalan
shutdown -P 60
saat startup.Gunakan cron
@reboot
untuk menjalankan perintah setelah boot.Tambahkan ke (root) crontab:
Untuk dua metode terakhir, Anda juga bisa menggunakan
sleep 3600 && shutdown -P now
alih-alih menggunakan argumen waktushutdown
untuk menunda shutdown selama 60 menit. Dengan cara ini login dapat dilakukan hingga saat terakhir sebelum shutdown dikeluarkan.sumber
sleep
perintah, Anda masih perlu menentukan waktu untukshutdown
- kami ingin menggunakannow
argumen itu jika kami sudah menunggu (tetapi perhatikan bahwa Anda tidak akan mendapatkan banyak peringatan untuk menyimpan pekerjaan Anda sebelum itu) menghilang dari bawah Anda!).shutdown -P 60
berfungsi, ini bukanlah cara bagaimana perintah harus dijalankan. Menurut halaman manual yang harus Anda gunakanshutdown -P +60
. --- Juga shutdown tanpa argumen waktu (dalam contohsleep 3600 && shutdown -P
) akan ditunda satu menit (sepertishutdown -P +1
). Seperti yang ditulis Toby Speight, Anda mungkin ingin menggunakannyashutdown -P now
.Ini terlihat seperti masalah XY .
Jika Anda mematikan setelah 60 menit, Anda berisiko bahwa Anda mungkin mengalami masalah yang sangat rumit dan hanya perlu memiliki lebih banyak waktu. Banyak solusi sebelumnya tidak membuatnya mudah untuk menunda shutdown.
Jika tugas tersebut bukan tugas interaktif, melainkan tugas skrip yang dipicu secara otomatis dari komputer lain, @sdkks memberikan solusi hebat untuk itu; Anda benar-benar harus menugaskan mesin untuk menjalankan poweroff segera setelah skrip dan semua tugasnya selesai.
Namun, jika tugas Anda adalah tugas interaktif, saya sarankan untuk melakukan deteksi siaga.
Jika Anda melakukan tugas Anda dalam GUI (X11), Anda dapat mendeteksi sesi GUI idle menggunakan pendekatan yang dijelaskan di sini: Jalankan perintah ketika sistem idle dan kapan aktif lagi
Jika Anda melakukan tugas melalui terminal, Anda dapat mendeteksi pengguna yang masuk menggunakan
who
perintah. Anda dapat mengatur cronjob yang mematikan mesin jikawho
mengembalikan hasil yang kosong. Perhatikan bahwa ini akan menjadi pendekatan yang cukup konservatif; itu tidak akan mematikan sistem jika Anda membiarkan konsol terhubung, tetapi idle.Jika Anda ingin menjadi sedikit lebih agresif dan memutuskan sesi terminal idle juga, Anda dapat menggabungkan pendekatan sebelumnya dengan secara otomatis memutuskan sesi SSH idle
ClientAliveInterval
danClientAliveCountMax
. Pendekatan lain untuk ini jika Anda tidak memiliki SSH, tetapi memiliki sesi terminal lokal, adalah dengan menggunakan waktu idle terminal seperti yang dikembalikan olehw
perintah.sumber
Meskipun jawaban sebelumnya di sini semuanya memenuhi persyaratan untuk kesempurnaan, Anda juga dapat mematikan mesin segera setelah tugas selesai.
bash
skrip dapat di-trap
ped, artinya sinyal-sinyal tertentu dapat dicegat dan tugas-tugas tertentu dapat dijalankan ketika dibutuhkan.EXIT
adalah salah satu sinyal yang bisa dijebak.Anda akan dapat:
trap
untukEXIT
skrip shell otomatis Anda, yang berarti penghentian tugas otomatis Andatrap
for your.bashrc
EXIT
, artinya kapan pun Anda keluar dari mesin itu, matikan.Opsi # 1 akan menjadi kasus yang ideal, asalkan tugas Anda tidak memerlukan inspeksi adhoc dan penilaian manual.
Opsi # 2 akan mencakup kasing di mana Anda akan lupa untuk keluar dari terminal tanpa mematikan. Namun ada peringatan; jika Anda memiliki beberapa terminal ke mesin yang sama terbuka dan Anda keluar dari salah satunya, itu akan tetap mematikan mesin sama saja. (Dapat ditulis untuk menghindari itu, tapi saya tidak akan menyulitkan solusinya.)
Ini bisa di akhir
.bashrc
opsi # 2, di suatu tempat di bagian atas skrip Anda untuk opsi # 1.Mengapa tidak menggunakan
poweroff
di akhir skrip?Saya lebih suka menggunakan
set -eo pipefail
di bagian atas skrip saya. Jika ada kesalahan, itu tidak akan gagal; itu akan berhenti mengeksekusi lebih banyak perintah.trap
dariEXIT
sinyal harus mencakup kasus di mana script berakhir sebelum waktunya karena kesalahan.Namun untuk tugas Anda, ini mungkin juga berarti mesin akan mati sebelum selesai.
Saya memiliki
bash
template sederhana yang saya gunakan untuk membuat scripting lebih mudah di-debug; mungkin mungkin ada gunanya. Silakan lihat intinya .sumber
.bashrc
saya lebih suka bagian bawah kalau-kalau ada hal lain yang menimpanya. Kekhawatiran Anda tampaknya tidak jelas, dapatkah Anda membagikan cuplikan contoh di repl.it mungkin?Mengelaborasi pada komentar @dirkt, Anda dapat memasukkan
at
perintah pada.bashrc
atau.profile
atau file mana saja yang digunakan shell Anda saat login untuk menjadwalkan shutdown otomatis 60 menit setelah login Anda.Sesuatu seperti:
sumber
at
. Anda juga dapat melihatat
tugas di/var/spool/
at
dalam konteks ini karena ia selamat dari reboot. Jika OP log in, shutdown manual dan kemudian login lagi dalam rentang satu jam, dia akan ditendang sebelum satu jam berlalu setelah login terakhirnya ketika proc shutdown terjadwal pertama.Berikut ini berjalan
command
dengan parameter, dan jika selesai dengan sukses itu akan mematikan kotak segera, dengan asumsi pengguna dapat berjalanpoweroff
. Mungkin perlu digunakansudo poweroff
.Sedangkan yang berikut ini hanya berjalan
poweroff
segera ketika perintah berakhir:Jika menurut Anda perintah itu perlu waktu istirahat setelah selesai, jalankan
Jika menurut Anda perintah itu bisa berjalan lembur, Anda bisa membatasi itu menjadi satu jam:
timeout
adalah bagian daricoreutils
paket sehingga Anda mungkin sudah memilikinya.sumber
Jika Anda benar-benar peduli dengan keamanan, gunakan timer outlet mekanis pada catu daya. Cukup atur kapan saja Anda ingin mematikannya. Dengan cara ini tidak ada yang bisa login dari jarak jauh dan menonaktifkan shutdown. Anda membutuhkan akses fisik.
sumber
Jika Anda berada di
systemd
mesin, Anda dapat menggunakan timer monotonUnit pengatur waktu
/etc/systemd/system/shutdown_after_an_hour.timer
Unit pengatur waktu
/etc/systemd/system/shutdown_after_an_hour.service
:Ini diaktifkan melalui
Statusnya (khususnya berapa banyak waktu yang tersisa sebelum penutupan) tersedia melalui
Ini akan bekerja pada reboot berikutnya, itu tidak berguna untuk
systemctl start
itu selama sesi ketika itu dibuat karena itu tidak akan berfungsi (karena itu tidak dipicu selama reboot) atau mematikan mesin segera jika melewati satu jam. Saya tidak tahu yang mana yang akan terjadi, saya belum pernah menguji kasus khusus itu.sumber
Cobalah untuk meletakkan skrip (
sudo shutdown -P 3600
) di/etc/init.d
direktori untuk menjalankannya secara otomatis saat startup.Atau coba gunakan
anacron
, tambahkan perintah dalam/etc/anacrontab
file. Saya juga menyarankan untuk menggunakannohup
di depan perintah untuk memastikan bahwa perintah masih berfungsi setelah keluar.sumber
Leverage File Keluar Shell Anda
Jika Anda hanya membutuhkan server untuk tugas-tugas interaktif atau non-interaktif yang dimulai oleh UID Anda, pertimbangkan untuk memasukkan perintah mematikan ke file ~ / .bash_logout Anda . The GNU Bash Pedoman mengatakan:
Jadi, menambahkan "sudo poweroff" atau mirip dengan file logout Anda akan mematikan server segera setelah Anda keluar dari sesi Anda saat ini, atau ketika sesi Bash non-interaktif panggilan
exit
. Anda juga dapat memilih untuk menggunakan pada atau melewatkan waktu tunda untuk shutdown jika Anda lebih suka menunda shutdown.Untuk pendekatan yang lebih interaktif, Anda dapat memasukkan Bashism berikut ke dalam file logout Anda:
Peringatan
Ada beberapa peringatan yang harus Anda ingat tentang solusi ini:
startx
atau serupa.exit
, Anda mungkin mengalami penghentian yang tidak Anda harapkan.NOPASSWD
perintah shutdown, atau jika Anda belum meneleponsudo -v
sebelum menjalankan perintah shutdown Anda.Singkatnya, Anda mungkin ingin mempertimbangkan apakah pendekatan ini memenuhi kebutuhan Anda yang sebenarnya, atau apakah pendekatan yang sama sekali berbeda seperti memantau tidak adanya pengguna yang masuk atau beberapa alternatif lain adalah taruhan yang lebih baik. Jarak tempuh Anda pasti akan bervariasi.
sumber