Bagaimana saya bisa membuat Mac OS X menjalankan program sebelum mematikan?


9

Saya mencoba untuk mendapatkan Mac OS X untuk menyimpan semua VM VirtualBox saya ketika reboot. Saya sudah memiliki skrip yang melakukan ini, tetapi saya perlu OS X untuk menjalankan skrip ini secara otomatis sebelum reboot.

Ketika Mac OS X reboot, apakah itu menjalankan / sbin / reboot?

Atau bagaimana lagi ini bisa dicapai?



Itu bukan duplikat. Saya tidak ingin tahu cara menjalankan skrip atau program saat logout. Saya ingin tahu cara menjalankan skrip atau program saat mematikan.
Andrew J. Brehm

1
Kamu benar. Bukan duplikat yang tepat. Jawaban dalam pertanyaan yang tertaut menyarankan pengguna untuk menempatkan skrip mereka /etc/rc.shutdown.localuntuk menjalankannya ketika dimatikan. Sepertinya itu yang Anda cari.
michaelmichael


Metode rc.shutdown.local tidak berfungsi.
Andrew J. Brehm

Jawaban:


5

Meskipun Apple merekomendasikan untuk menggunakan " launchd ", cara termudah adalah membuat skrip shell menggunakan, misalnya, pico Terminal:

pico /Users/Shared/logoutHook.sh

File dapat berisi sesuatu seperti:

#!/bin/bash
say 'Hasta la vista baby!'

Kemudian berikan hak eksekusi:

sudo chmod +x /Users/Shared/logoutHook.sh

Akhirnya, kaitkan skrip ke prosedur logout:

sudo defaults write com.apple.loginwindow LogoutHook /Users/Shared/logoutHook.sh

Jika Anda memulai aplikasi lain, karena saya belum menguji ini, saya pikir mungkin berguna untuk memperingatkan diri saya dan Anda bahwa:

  • Kita mungkin perlu mematikan sinyal mematikan untuk menjalankan apa yang kita inginkan;

  • Kemudian kirim yang baru (jangan sampai membunuh sinyal yang dikirim oleh
    skrip kami sendiri ) ...


Jika Anda ingin menghapus kail:

sudo defaults delete com.apple.loginwindow LogoutHook

Jika menggunakan " launchd ", idenya adalah untuk menangkap sinyal SIGTERM. Lihatlah: /System/Library/LaunchDaemons/com.apple.shutdown_monitor.plist


4

Launchd mengirimkan peringatan dini shutdown ke semua skrip / daemon yang memiliki subrutin StopService () . Ini memberikan proses Anda paling banyak waktu untuk membersihkan.

Cukup gunakan launchd untuk memulai skrip dan menjalankannya di latar belakang sampai saatnya untuk keluar.

Setelah layanan yang mendapat peringatan dini ditutup, semua proses mendapatkan SIGTERMsinyal beberapa detik sebelum SIGKILLnuklir mereka.

Anda bisa membuat skrip yang tidur dan menjebak SIGTERM untuk menjalankan perintah Anda ketika saatnya tiba. Anda harus melihat apakah itu memungkinkan cukup waktu dalam praktik untuk menjalankan perintah. Ini menghindari sedikit pengkodean, tetapi tidak banyak - umumnya lebih baik membuat daemon dari skrip shell.


Dari perspektif sejarah - /sbin/rebootdan runlevel tidak pernah ada di Darwin / OS X dan rc.shutdownditinggalkan bersama dengan sisa dari rcsekarang yang launchdmenjadi bos. Anda mungkin dapat menggunakan rc.shutdown pada harimau atau sebelumnya (saya tidak memiliki salah satu dari gambar-gambar itu untuk memeriksa saat ini) Lion tentu saja telah menghapus semua sisa dari rc.d dan init.d.

Anda mungkin ingin melihat apakah pengamat tidur akan membantu dalam kasus Anda. Saya belum menggunakannya dalam waktu yang cukup lama - tetapi tentu saja ini bertujuan untuk menyelesaikan dilema Anda.


Ternyata "usang" berarti "tidak bekerja". :-(
Andrew J. Brehm

Yup - peringatan dimulai pada Tiger dan saya kira itu hilang dengan Leopard - sulit untuk mengingat dengan semua perubahan Lion yang berkeliaran di otak saya.
bmike

Ini sangat memperumit masalah dan menjadikan Mac OS X platform server yang sangat buruk.
Andrew J. Brehm

launchd sepenuhnya mampu menjalankan skrip saat shutdown. Mungkin saya harus mengedit sejarah dan membiarkan fakta itu lebih jelas. Dengan cara apa launchd gagal kebutuhan Anda untuk menjalankan skrip saat shutdown?
bmike

Saya tidak tahu cara membuat skrip launchd run saat shutdown. Saya menggunakan launchd untuk memulai sesuatu saat boot.
Andrew J. Brehm
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.