Jalankan skrip saat logout / reboot / shutdown di Ubuntu

30

Saya ingin menjalankan .shfile menggunakan bash pada logout dan shutdown Ubuntu. Saya telah mencari ke atas dan ke bawah web dan hanya menemukan perbaikan untuk KDE dan GNOME. Skripnya sederhana, saya hanya perlu tahu apakah saya bisa menambahkan baris kode ke file "logoff / shutdown" atau jika saya perlu referensi di skrip lain.

DirtyDenimDan
sumber
1
Masukkan symlinks ke executable di /etc/init.d di /etc/rc0.d, dan /etc/rc6.d
Yet Another User
2
Harap pertimbangkan untuk menerima jawaban yang diperbarui (menggunakan systemd) sehingga orang akan melihatnya di atas.
Jonathan Y.

Jawaban:

18

Untuk menjalankan skrip saat keluar:

Tambahkan baris berikut:

session-cleanup-script=/path/to/script

dalam /etc/lightdm/lightdm.conffile.

Anda harus memulai ulang lightdm agar perubahan ini berlaku. Untuk melakukan ini, masuk tty1 menggunakan Ctrl+ Alt+ F1, login dengan nama pengguna dan kata sandi Anda dan jalankan perintah berikut:

sudo service lightdm restart

Catatan: gunakan Ctrl+ Alt+ F7untuk beralih ke sesi grafis

Untuk menjalankan skrip saat reboot:

  1. Masukkan skrip Anda /etc/rc0.d
  2. Jadikan itu dapat dieksekusi: sudo chmod +x K99_script
  3. Catatan:
    • Skrip dalam direktori ini dieksekusi dalam urutan abjad.
    • Nama skrip Anda harus dimulai dengan K99dijalankan pada waktu yang tepat.

Untuk menjalankan skrip saat shutdown:

  1. Masukkan skrip Anda /etc/rc6.d
  2. Jadikan itu dapat dieksekusi: sudo chmod +x K99_script
  3. Catatan:
    • Skrip dalam direktori ini dieksekusi dalam urutan abjad.
    • Nama skrip Anda harus dimulai dengan K99dijalankan pada waktu yang tepat.

Sumber:

Radu Rădeanu
sumber
4
Itu konvensional untuk nama skrip dimulai dengan Kuntuk 'Bunuh' dan Suntuk 'Mulai'.
kiri
Bagaimana jika skrip membutuhkan hak akses sudo? Sejauh yang saya tahu, skrip /etc/rc6.d dijalankan sebagai pengguna, dan tidak dapat menggunakan gksudo.
Urhixidur
1
tidak bekerja untuk saya dengan 14,04, apakah ada perubahan atau fakta penting yang tidak ditentukan?
tomasb
2
Saran K99 tidak baik untuk shutdown / reboot jika Anda ingin menyimpan beberapa data karena itu terjadi SETELAH meng-unmount DAN K digunakan untuk menonaktifkan skrip (lihat /etc/rcS.d/README), gunakan S untuk memulai dan letakkan sebelum unmount, untuk tempat bootup skrip Anda setelah mount, terjebak pada ini karena informasi yang salah ini, diselesaikan dengan S sebagai huruf pertama
tomasb
6
Ini sangat salah: i) nama skrip harus dimulai dengan Kuntuk runlevels 0, 1 dan 6 dan Suntuk runlevels 2, 3, 4 dan 5; ii) Anda tidak perlu memanggil skrip K99_foo, nomor hanya menentukan urutan skrip dijalankan. Anda harus memilih satu yang lebih besar dari yang lain jika Anda ingin dijalankan terakhir; iii) Runlevel 0 bukan untuk reboot! ; Ini untuk mematikan. 6 untuk reboot. iv) skrip tidak memiliki bisnis berada di /etc/rcN.ddirektori. Mereka seharusnya masuk /etc/init.ddan ditautkan ke /etc/rcN.d.
terdon
14

Bagaimana melakukannya dengan systemd

Jika Anda menemukan utas ini setelah Juni 2016, Ubuntu dan turunannya termasuk Mint akan menggunakan systemd untuk mengontrol inisialisasi dan penutupan sistem. Saya punya masalah dengan pendekatan lama sehingga meneliti cara systemd.

Dengan systemd Anda membuat satu atau dua file untuk memanggil skrip Anda menggunakan templat di bawah ini, dan menjalankan perintah. Sederhana.


Versi GUI

Pertama buat skrip yang ingin Anda jalankan saat startup dan / atau shutdown. Saya membuat .scopening_atstart dan .scfullcopy_atend.

Kemudian pastikan keduanya dapat dieksekusi dengan mengklik kanan file, memilih properti dan memastikan bahwa, di bawah izin, Anda telah mencentang Izinkan mengeksekusi file sebagai program.

Dua file yang saya buat mengisi dan menyimpan konten ramdisk. Mereka juga membuat file di direktori rumah saya untuk membuktikan bahwa layanannya berfungsi. Mereka adalah bentuk:

#!/bin/sh
cp -pru /home/john/zRamdisk/subdirectory1/* /home/john/.wine/drive_c/subdirectory1/
rm /home/john/stop_time
date +%D' '%T > /home/john/stop_time

Kemudian saya membuka file manager saya sebagai root, membuka /etc/systemd/systemdan membuat file startup.service dan file save-ramdisk.service. Jelas Anda dapat memilih nama Anda sendiri dan nama generik dapat menyertakan file startup yang disebut johns_start.service dan file shutdown yang disebut johns_shutdown.service. Hanya saja, jangan memilih nama layanan yang ada.

[Unit]
Description=Startup Applications

[Service]
Type=oneshot
RemainAfterExit=false
ExecStart=/home/john/.scopening_atstart

[Install]
WantedBy=multi-user.target

dan

[Unit]
Description=Save Ramdisk to Wine drive C

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/home/john/.scfullcopy_atend

[Install]
WantedBy=multi-user.target

Anda dapat menggunakan file layanan yang sama, menggantikan jalur lengkap skrip yang dapat dieksekusi untuk saya.

Akhirnya untuk masing-masing jalankan perintah systemctl aktifkan your_files_name (tetapi tanpa layanan akhiran). Jadi yang pertama adalahsystemctl enable startup

Nyalakan kembali komputer satu kali untuk memulai layanan. Layanan mulai akan dijalankan setiap kali systemd memasuki target multi-pengguna dan layanan berhenti ketika keluar dari target multi-pengguna. File layanan alternatif dengan berbagai kondisi aktivasi akan dijelaskan di bawah ini.


Versi CLI (Command Line)

Deskripsi ini mengasumsikan bahwa Anda beroperasi dari direktori home Anda daripada / home / john, gunakan sudo sesuai kebutuhan, dan editor pilihan Anda tempat saya menulis vim atau svim.

Buat skrip startup dan shutdown shell dengan baris pertama #!/bin/shdan buat agar dapat dieksekusi menggunakan chmod +x my_new_filename.

Buat dua file seperti di atas, atau dalam contoh ini, satu file untuk menangani tugas-tugas startup dan shutdown. Saya akan menjalankan skrip di direktori home saya tetapi @don_crissti menunjukkan beberapa alternatif di Stack Exchange.

svim /etc/systemd/system/start_and_stop.service

dan salin dalam konten file:

[Unit]
Description=Run Scripts at Start and Stop

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/home/john/.startup_commands  #your paths and filenames
ExecStop=/home/john/.shutdown_commands

[Install]
WantedBy=multi-user.target

Kemudian Aktifkan Layanan dengan perintah:

systemctl enable start_and_stop

dan reboot sistem Anda setelah itu layanan akan aktif. Perintah systemctl is-enabled start_and_stopdan systemctl is-active start_and_stopdapat digunakan dalam memonitor layanan baru Anda.


Mengubah Kondisi Pemicu Shutdown

File-file di atas semua menggunakan buka atau tutup lingkungan multi-pengguna untuk memulai menjalankan skrip. File di bawah ini menggunakan awal dari empat proses mematikan potensial untuk memulai skripnya. Menambahkan atau menghapus target pada baris Sebelum + baris WantedBy akan membuat Anda membuat perbedaan yang lebih baik:

File ini diusulkan dalam jawaban di Unix & Linux oleh @Matthias tapi saya tidak bisa menjalankannya sampai saya menambahkan bagian Instal.

Sekali lagi, edit skrip di /etc/systemd/service/dan aktifkan menggunakan systemctl enable your_file_name. Ketika saya mengubah target saya menggunakan systemclt disable file_nameperintah dan kemudian mengaktifkannya kembali yang menghubungkannya dengan direktori target. Reboot dan layanan akan beroperasi.

[Unit]
Description=Do something required
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target
# This works because it is installed in the target and will be
#   executed before the target state is entered
# Also consider kexec.target

[Service]
Type=oneshot
ExecStart=/home/john/.my_script  #your path and filename

[Install]
WantedBy=halt.target reboot.target shutdown.target
Yohanes 9631
sumber
1
Meskipun posting Anda benar, saya sarankan memperbaikinya dengan menambahkan contoh bagaimana langkah-langkah tersebut dapat dilakukan dengan sistem. Harap beri tahu saya setelah Anda mengedit posting Anda. Terima kasih dan selamat datang di AskUbuntu
Sergiy Kolodyazhnyy
Hai Serg, maksud Anda contoh seperti di pos yang ditautkan atau apakah Anda memiliki hal lain dalam pikiran? Kedua, saya tidak yakin bagaimana "memberi tahu Anda" karena saya tidak dapat menemukan mekanisme untuk menghubungi pengguna SO lainnya.
Yohanes 9631
Ya, Anda bisa memberikan contoh yang sama seperti di pos lainnya. Mengatakan "buka tautan lain" itu tidak bagus dan membuat jawaban Anda terlihat malas. Juga untuk menghubungi pengguna SO lain yang menggunakan @ sebelum nama pengguna, misalnya @Serg
Sergiy Kolodyazhnyy
Jauh lebih baik. Baiklah, pertahankan kerja bagus!
Sergiy Kolodyazhnyy
1
menurut man systemd.unitfile yang dibuat pengguna dapat ditempatkan di $XDG_CONFIG_HOME/systemd/userdan lokasi pengguna lokal lainnya
Antonios Hadjigeorgalis