Bagaimana cara mengonfigurasi pemula untuk menjalankan skrip saat shutdown saat prosesnya membutuhkan waktu lebih dari 10 detik?


11

Saya menjalankan ubuntu 11.10 di mesin virtual (VirtualBox) untuk mempelajari lebih lanjut tentang pengembangan di linux. Saya menggunakan repositori git untuk menyimpan pekerjaan saya dan telah menulis skrip untuk menggabungkan pekerjaan saya dan menyimpannya ke folder bersama untuk digunakan saat mesin virtual tidak berjalan.

Saya ingin menjalankan skrip ini secara otomatis sebelum shutdown sehingga pekerjaan saya selalu tersedia jika vm dimatikan (saat ini saya harus menjalankan skrip secara manual).

Saya tidak tahu apakah pemula adalah cara terbaik untuk mencapai ini, tetapi ini adalah konfigurasi yang saya tulis sebagai ujian:

description     "test script to run at shutdown"

start on runlevel [056]

task

script
touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long
end script

pre-start script
touch /media/sf_LinuxEducation/pre-start
sleep 15
touch /media/sf_LinuxEducation/pre-start-long
end script

post-start script
touch /media/sf_LinuxEducation/post-start
sleep 15
touch /media/sf_LinuxEducation/post-start-long
end script

pre-stop script
touch /media/sf_LinuxEducation/pre-stop
sleep 15
touch /media/sf_LinuxEducation/pre-stop-long
end script

post-stop script
touch /media/sf_LinuxEducation/post-stop
sleep 15
touch /media/sf_LinuxEducation/post-stop-long
end script

Hasilnya adalah hanya satu sentuhan yang dicapai (sentuhan pertama di awal). Apa yang perlu saya ubah untuk melihat salah satu sentuhan setelah tidur bekerja? Atau apakah ada cara yang lebih mudah untuk mencapai ini?

Terima kasih sebelumnya.

Jawaban:


7

The Upstart Intro, Cookbook dan Best Practices memiliki sejumlah besar potongan kode untuk digunakan dalam menciptakan tugas kaya baru dan pekerjaan.

Bagian proses mematikan dari buku resep mengatakan bahwa /etc/init/rc.confakan dijalankan dan menelepon /etc/init.d/rc. Pada gilirannya ini pada akhirnya akan memanggil /etc/init.d/sendsigs. Jadi jika Anda start on starting rcmaka tugas Anda akan dieksekusi sebelum rc (dan sigterms yang biasanya akan menghentikan proses).

file: /etc/init/test.conf

description "test script to run at shutdown"

start on starting rc
task
exec /etc/init/test.sh

file: /etc/init/test.sh

touch /media/sf_LinuxEducation/start
sleep 15
touch /media/sf_LinuxEducation/start-long

1
Menambahkan contoh konkret ke pertanyaan ini, tetapi tidak berfungsi (hanya sentuhan pertama yang dijalankan saat dimatikan) meskipun dokumentasi di Buat Acara Alias mengatakan bahwa itu harus. Silakan melihatnya dan lihat apakah saya membuat kesalahan.
Tiris

Tiris, ini seharusnya berhasil. Saya akan tertarik melihat / var / log / syslog Anda setelah reboot, terutama untuk melihat apakah proses pengujian secara paksa dibunuh oleh pemula.
SpamapS

1
Hasil edit terbaru dari jawaban ini berfungsi. Periksa riwayat revisi untuk melihat anak yang bermasalah. Saya kira saya seharusnya berkomentar bahwa saya melakukan edit (atau apakah lebih tepat untuk menghapus komentar dan menambahkan yang baru? Apakah ada etiket stackexchange?). Saya akan tertarik mengetahui mengapa masalah anak tidak berhasil (karena dokumentasi mengatakan itu harus).
Tiris

Apa sebenarnya arti file test.conf? Apakah saya membuat file bernama test.conf, atau apakah saya menambahkan ini ke rc.conf?
heneryville

@heneryville test.confhanyalah nama file acak. Anda bisa dengan mudah menggunakannya whatEverYouWant.conf. Komentar Anda juga menunjukkan bahwa Anda tidak membaca "Buku Masak" yang disebutkan dalam jawaban. Jika Anda melihat di bagian 4.2, File Konfigurasi Pekerjaan dijelaskan dengan lebih seksama.
Tiris

7

Saya pikir ini tidak dapat dilakukan melalui pemula , sebagai script /etc/init.d/endendsigs , yang dipanggil oleh pemula saat menghentikan / memulai kembali, membunuh semua proses ( killall5 -9) dalam 10 detik, dan bahkan jika itu tidak berhasil, ia pergi untuk meng-unmount semuanya dan shutdown.

Cara terbaik adalah dengan menggunakan skrip gaya /etc/init.d yang sudah usang.

Contoh: /etc/init.d/shutdown_job

#! /bin/sh
### BEGIN INIT INFO
# Provides:          shutdown_job
# Required-Start:    
# Required-Stop:     sendsigs
# Default-Start:
# Default-Stop:      0 6
# Short-Description: bla
# Description: 
### END INIT INFO

PATH=/sbin:/usr/sbin:/bin:/usr/bin

. /lib/lsb/init-functions

do_stop () {
    date > /root/s.log
    sleep 20
    date >> /root/s.log
}

case "$1" in
  start)
    # No-op
    ;;
  restart|reload|force-reload)
    echo "Error: argument '$1' not supported" >&2
    exit 3
    ;;
  stop)
    do_stop
    ;;
  *)
    echo "Usage: $0 start|stop" >&2
    exit 3
    ;;
esac

:

Kemudian aktifkan skrip

sudo update-rc.d shutdown_job start 19 0 6 .

Ini akan menempatkan script sebelum script sendigs pada runlevel 0 a 6 (shutdown, reboot). Skrip sampel ini akan merekam tanggal, lalu tidur selama 20 detik, lalu merekam kembali tanggal ke /root/s.log .)

Info lebih lanjut:


Saya sama sekali tidak terbiasa melakukan hal semacam ini. Apakah ada panduan yang baik untuk membuat ini bekerja? Harap edit dengan info lebih lanjut.
Tiris

Saya mencoba ini dan tidak berhasil (yah tidak persis). Saya menambahkan touch /media/sf_LinuxEducation/startdan touch /media/sf_LinuxEducation/start-longtepat di sebelah perintah tanggal. Tanggal dicatat, tetapi sentuhan tidak tersentuh. Ini membuat saya bertanya-tanya apakah drive itu dilepas pada saat skrip dijalankan. Saya pikir ini mungkin ada hubungannya dengan argumen NN, meskipun saya tidak yakin bagaimana cara kerja argumen ini (halaman manual menjelaskannya dengan cara yang sangat membengkokkan pikiran). Bagaimana Anda tahu nomor (atau pasangan angka) apa yang harus ditetapkan dalam argumen ini?
Tiris

Script dieksekusi sesuai jumlah mereka seperti yang terlihat ketika Anda daftar /etc/rc6.ddirektori. Jadi 19 shutdown script harus telah dilaksanakan sebelum unmounting apapun dilakukan (> 31). Tetapi mengapa tidak mencoba hipotesis Anda dan menyentuh file /rootsebagai gantinya?
atur

Melihat dalam dir /etc/rc6.dmenunjukkan bahwa folder bersama sedang dipasang / dilepas dengan K70vboxaddskrip. Apakah mengubah argumen NN (untuk skrip saya) menjadi 71 membuat skrip saya dijalankan sebelum meng-unmount folder VB yang dibagikan? Saya akan mencobanya hari ini.
Tiris

Yah itu tidak berhasil. Pembaruan: Saya menambahkan touch /root/startsebelum sleep 20perintah dan tidak ada file yang dibuat. Saya bahkan tidak tahu harus mulai dari mana mencari tahu alasannya. Tanggal yang gembira ditambahkan ke /root/s.logberkas mengapa saya tidak bisa menyentuh file?
Tiris
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.