Pertanyaan Jalankan skrip saat logout / reboot / shutdown di Ubuntu


Saya ingin menjalankan .sh file menggunakan bash pada logout dan shutdown dari 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 dapat menambahkan baris kode ke file "logoff / shutdown" atau jika saya perlu referensi di skrip lain.


27
2018-05-10 01:13


asal


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


Jawaban:


Untuk menjalankan skrip saat keluar:

Tambahkan baris berikut:

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

di /etc/lightdm/lightdm.conf mengajukan.

Anda harus me-restart lightdm agar perubahan ini berlaku. Untuk melakukan ini, gunakan tty1 Ctrl+Alt+F1, masuk dengan nama pengguna dan kata sandi Anda dan jalankan perintah berikut:

sudo service lightdm restart

Catatan: gunakan Ctrl+Alt+F7 untuk 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 dijalankan dalam urutan abjad.
    • Nama skrip Anda harus dimulai K99 berjalan 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 dijalankan dalam urutan abjad.
    • Nama skrip Anda harus dimulai K99 berjalan pada waktu yang tepat.

Sumber:


18
2017-07-24 08:55



Nya konvensional untuk menyebut skrip dimulai dengan K untuk 'Bunuh' dan S untuk 'Mulai'. - kiri
Bagaimana jika skrip perlu hak sudo? Sejauh yang saya tahu, skrip /etc/rc6.d dijalankan sebagai pengguna, dan tidak dapat menggunakan gksudo. - Urhixidur
tidak bekerja untuk saya dengan 14.04, apakah ada perubahan atau fakta penting yang tidak spesifik? - tomasb
Saran K99 tidak baik untuk shutdown / reboot jika Anda ingin menyimpan beberapa data karena terjadi SETELAH unmount DAN K digunakan untuk menonaktifkan skrip (lihat /etc/rcS.d/README), gunakan S untuk memulai dan letakkan sebelum unmounts, untuk bootup tempat skrip Anda setelah mount, terjebak pada ini karena kesalahan informasi ini, diselesaikan dengan S sebagai huruf pertama - tomasb
Ini sangat salah: i) nama skrip harus dimulai dengan a K untuk runlevels 0, 1 dan 6 dan S untuk runlevel 2, 3, 4 dan 5; ii) kamu tidak perlu untuk memanggil skrip K99_foo, nomor tersebut menentukan urutan skrip dijalankan. Anda harus memilih salah satu yang lebih besar daripada yang lain jika Anda ingin itu dijalankan terakhir; aku aku aku) Runlevel 0 bukan untuk reboot!; Ini untuk shutdown. 6 untuk reboot. iv) skrip tidak memiliki bisnis dalam /etc/rcN.d direktori. Mereka seharusnya berada /etc/init.d dan terkait untuk /etc/rcN.d. - terdon♦


Bagaimana melakukannya dengan systemd

Jika Anda menemukan utas ini setelah Juni 2016, Ubuntu dan turunannya termasuk Mint akan menggunakan sistemd untuk mengontrol inisialisasi dan shutdown sistem. Saya memiliki masalah dengan pendekatan lama sehingga meneliti jalannya sistem.

Dengan systemd Anda membuat satu atau dua file untuk memanggil skrip Anda menggunakan template 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 bahwa keduanya dapat dieksekusi dengan mengklik kanan file, memilih properti dan memastikan bahwa, di bawah izin, Anda telah mencentang Izinkan file eksekusi sebagai program.

Kedua file yang saya buat mengisi dan menyimpan isi ramdisk. Mereka juga membuat file di direktori rumah saya untuk membuktikan bahwa layanan tersebut berfungsi. Mereka adalah dari 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, terbuka /etc/systemd/system dan membuat file startup.service dan file save-ramdisk.service. Tentunya Anda dapat memilih nama Anda sendiri dan nama generik bisa termasuk file startup bernama johns_start.service dan file shutdown yang disebut johns_shutdown.service. Jangan pilih 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 eksekusi Anda untuk saya.

Akhirnya untuk masing-masing menjalankan perintah systemctl enable your_files_name (tetapi tanpa layanan suffix). Jadi yang pertama saya systemctl enable startup 

Reboot komputer sekali untuk memulai layanan. Layanan awal akan dijalankan setiap kali sistem masuk ke target multi-pengguna dan layanan berhenti ketika keluar dari target multi-pengguna. File layanan alternatif dengan kondisi aktivasi yang berbeda akan dijelaskan di bawah ini.


Versi CLI (Command Line)

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

Membuat skrip startup dan shutdown shell dengan baris pertama #!/bin/sh dan membuat mereka dapat dieksekusi menggunakan chmod +x my_new_filename.

Membuat dua file seperti di atas, atau dalam contoh ini, satu file untuk menangani tugas startup dan shutdown. Saya akan mengeksekusi 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-perintahnya systemctl is-enabled start_and_stop dan systemctl is-active start_and_stop dapat digunakan dalam memantau layanan baru Anda.


Mengubah Kondisi Pemicu untuk Shutdown

File-file di atas semua menggunakan open atau close dari lingkungan multi-user untuk memulai menjalankan skrip. File di bawah ini menggunakan awal dari empat proses penghentian potensial untuk memulai skripnya. Menambahkan atau menghapus target pada baris Sebelum + baris WantedBy akan memungkinkan Anda membuat perbedaan yang lebih jelas:

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

Sekali lagi, edit skrip di /etc/systemd/service/ dan memungkinkannya menggunakan systemctl enable your_file_name. Ketika saya mengubah target yang saya gunakan systemclt disable file_name perintah dan kemudian mengaktifkannya kembali yang symlink ke 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

13
2017-07-07 22:03



Meskipun posting Anda benar, saya sarankan untuk memperbaikinya dengan menambahkan contoh bagaimana langkah-langkah tersebut dapat dilakukan dengan sistem. Tolong beritahu saya setelah Anda mengedit posting Anda. Terima kasih dan selamat datang di AskUbuntu - Sergiy Kolodyazhnyy
Hai Serg, maksud Anda contoh-contoh seperti di posting terkait atau apakah Anda memiliki sesuatu yang lain dalam pikiran? Kedua, saya tidak yakin bagaimana "membiarkan Anda tahu" karena saya tidak dapat menemukan mekanisme untuk menghubungi pengguna SO lain. - John 9631
Ya, Anda bisa memberikan contoh yang sama seperti di pos Anda yang lain. Hanya mengatakan "buka tautan yang lain" tidak terlalu bagus dan membuat jawaban Anda terlihat malas. Juga untuk menghubungi pengguna lain yang menggunakan SO @ sebelum nama pengguna, misalnya @Serg - Sergiy Kolodyazhnyy
Banyak yang ditingkatkan. Baiklah, pertahankan kerja bagusmu! - Sergiy Kolodyazhnyy
Menurut man systemd.unit file yang dibuat pengguna dapat ditempatkan di $XDG_CONFIG_HOME/systemd/user dan lokasi pengguna lokal lainnya - Antonios Hadjigeorgalis