Jalankan perintah sebelum shutdown / reboot [duplikat]

18

Saya memiliki mesin yang menjalankan beberapa VM gelandangan. Masalah yang saya miliki adalah bahwa kadang-kadang saya lupa mematikan VM sebelum mematikan atau mem-boot ulang komputer saya. Karena itu mesin saya macet dengan pesan ini:waiting for vboxnet0 to become free

Saya mencari solusi dan saya menemukan halaman ini:

http://en.kioskea.net/faq/3348-ubuntu-executing-a-script-at-startup-and-shutdown

Saya mencoba apa yang mereka untuk shutdown, tetapi tidak berhasil.

Saya menulis file sh untuk perintah itu:

#!/bin/bash

cd ~/workspace/git/mediaservice
vagrant halt

ada saran?

SERPRO
sumber
4
Metode dalam tautan ini valid dan berfungsi pada semua versi linux sehingga skrip Anda salah;) Pengguna tidak dikenal saat shutdown karena dilakukan oleh root pengguna. Jadi jatuhkan "~" dan jadikan itu jalur penuh.
Rinzwind
Apakah itu bekerja? Saya mengikuti manuel serupa seperti gist.github.com/ymc-geha/8416723 tetapi tidak berhasil untuk saya di ubuntu 14.04
user2135804
@ user2135804 Saya pikir itu .. tapi sebenarnya itu tidak bekerja untuk Vagrant .. Saya mencoba dengan hal-hal lain dan itu bekerja dengan baik.
SERPRO
1
Ngomong-ngomong, bug yang Anda gambarkan ada di sini .
Garrett
1
Seperti yang terlihat dalam laporan bug, ini telah diperbaiki dan akan disertakan dengan VirtualBox 4.3.29.
Garrett

Jawaban:

11

Jika VM gelandangan Anda menggunakan VirtualBox, Anda dapat memodifikasi / etc / default / virtualbox dan mengubah baris yang berbunyi:

SHUTDOWN_USERS=""

untuk

SHUTDOWN_USERS="all"

Itu diperbaiki untuk saya di Ubuntu 14.04

GaryBishop
sumber
1
Sebenarnya ada tiket terbuka di kotak virtual yang terhubung dengan ini. virtualbox.org/ticket/12264 . Saya akan menyarankan menggunakan SHUTDOWN_USERS=`cut -d: -f1 /etc/passwd`bukanSHUTDOWN_USERS="all"
running.t
Saya juga di Ubuntu 14,04 dengan Vagrant menggunakan VirtualBox, tapi saya tidak punya /etc/default/virtualboxfile ...
Garrett
21

Untuk menjalankan skrip saat shutdown atau reboot:

  1. simpan skrip Anda di /etc/rc6.d
  2. Jadikan itu dapat dieksekusi: sudo chmod +x K99_script

Catatan:

  • Skrip di rc6.d harus tanpa ekstensi .sh
  • Nama skrip Anda harus dimulai dengan K99 untuk dijalankan pada waktu yang tepat.
  • Script dalam direktori ini dieksekusi dalam urutan abjad.

sumber

Maythux
sumber
1
Memang. Memberinya nama dengan benar sehingga berjalan pada waktu yang tepat sangat penting.
shivams
1
Saya meletakkan script di /etc/rc6.d dan itu tidak berjalan saat shutdown. Saya meletakkannya di /etc/rc0.d dan itu berjalan saat shutdown. Mungkin, rc.6 hanya untuk reboot.
Erel Segal-Halevi
2
@Erel Segal-Halevi Saya baru saja mencoba menambahkan skrip K99 ke /etc/rc6.d dan tidak dieksekusi. Melihat skrip lain, ada baris ** huruf tebal K10reboot -> ../init.d/reboot kode **, jadi sepertinya skrip K99 TIDAK AKAN PERNAH dieksekusi !!
David Walker
Jawaban dari Ravi di bawah adalah pilihan yang lebih baik karena menggunakan symlink untuk memastikan skrip berjalan pada shutdown DAN reboot. Saya juga berpikir sebagian besar file sistem cenderung mengambil pendekatan ini.
Eddie
12

Bagaimana Melakukannya dengan Systemd (lebih mudah)

Sekarang varian Ubuntu dan Mint telah pindah ke systemd saya menemukan solusi lama saya berdasarkan di atas menjadi kurang memuaskan. Saya mencari di seluruh web untuk mengetahui bagaimana melakukannya dengan systemd dan akhirnya menggabungkan kebijaksanaan orang lain dan mendokumentasikannya sebagai posting blog di blogspot.com.au yang berisi tutorial berikut.

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


Versi GUI

Pertama buat skrip yang ingin Anda jalankan saat startup dan / atau shutdown. Lakukan saja jika Anda tidak membutuhkan keduanya. 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.

masukkan deskripsi gambar di sini

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.

Perintah tambahan yang berguna termasuk:

systemctl adalah startup yang diaktifkan
systemctl adalah startup yang aktif
systemctl restart startup

Lebih banyak dapat ditemukan di referensi di atas.



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 pada jawaban kedua posting ini tetapi saya tidak dapat 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
7
lebih mudah? lebih mudah dari apa? lebih mudah daripada mendaki Everest? setiap solusi lain yang diposting di sini lebih mudah daripada yang ini ...
Fran Marzoa
Wow, itu jawaban yang lengkap dan ditulis dengan baik, dan apa yang harus dilakukan semua orang - masalah penamaan dengan /etc/rc6.d dan kebingungan menunjukkan bahwa itu bukan jawaban yang baik. Jika suatu prosedur sederhana, maka itu tidak harus memiliki kekuatan untuk mencapai tujuannya dengan aman. Lihat bagian [Instal] - Anda dapat memastikan bahwa skrip Anda akan dijalankan pada waktu yang tepat. Lebih jauh, karena sebuah jawaban panjang, itu tidak berarti bahwa itu rumit! Terima kasih btw, John9631, jawaban ini sempurna dan akan sangat berharga dalam membuat skrip yang aman dan efisien pada titik kritis misi dalam waktu ...
penggilingan gorila
11
  1. Buat file executable shell dengan skrip Anda di direktori /etc/init.d/.

  2. Karena ini harus dijalankan selama shutdown atau reboot perlu membuat softlink di /etc/rc0.d/ dan /etc/rc6.d

Contoh:

sudo ln -s /etc/init.d/<your_file> /etc/rc0.d/k99stop_vm
sudo ln -s /etc/init.d/<your_file> /etc/rc6.d/k99stop_vm
sudo chmod a+x /etc/init.d/<your_file>
Ravi
sumber
chmodmengubah tanda izin target tautan, yang sama untuk kedua argumen. Menentukan keduanya sama-sama mubazir.
David Foerster
2

Anda dapat menemukan solusinya di sini: Tangguhkan / lanjutkan semua kotak Vagrant pada saat sistem mati / mulai .

Ada skrip init sederhana yang menunda semua kotak yang berjalan sebelum dimatikan.

Instalasi

Edit /etc/init.d/vagrant-boxesdan rekatkan skrip dari artikel di atas dan simpan. Atau unduh dari sini dan simpan di /etc/init.d/vagrant-boxes. Pada debian / ubuntu dll, jalankan

# update-rc.d vagrant-boxes defaults 99 01

Nomor 99 adalah nomor urut dan harus lebih besar dari (dalam kasus saya Virtualbox nomor 20, yang merupakan default pada distro Debian). Angka kedua adalah urutan saat mematikan komputer. Jadi, mungkin lebih baik dilakukan terlebih dahulu.

milkovsky
sumber
2

Untuk Ubuntu 14.10 Anda suka RC04tidakRC99

Apa yang harus dilakukan dari awal

  1. Buat skrip di /etc/init.d/scriptName
  2. Tautan via ln -s /etc/rc6.d/K04scriptName /etc/init.d/scriptName

Langkah-langkah yang saya lalui

  1. Saya mencoba gagal menggunakan Ubuntu - Menjalankan skrip saat startup dan shutdown
  2. Saya menemukan skrip shutdown Ubuntu 14.10 dengan rc0.d (rc6.d, rc.d)
  3. Saya berubah dari /etc/rc6.d/RC99linkName menjadi /etc/rc6.d/RC04linkName dan ia berfungsi
Anthony Astige
sumber