Bagaimana cara menjalankan skrip Bash sebelum mematikan atau mem-boot ulang Raspberry Pi (menjalankan Raspbian)?

Saya ingin menjalankan skrip Bash sebelum mematikan atau mem-boot ulang Pi saya (menjalankan Raspbian terbaru, turunan dari Debian).

misalnya jika saya mengetik sudo shutdown now atau sudo reboot now ke dalam command prompt, skrip Bash saya akan dijalankan sebelum melanjutkan dengan shutdown/reboot.

Saya membuat skrip yang sangat sederhana hanya untuk pengujian, untuk memastikan metode saya berfungsi sebelum saya repot-repot menulis skrip yang sebenarnya:

#!/bin/bash
touch /home/pi/ShutdownFileTest.txt

Saya kemudian menyalin file (bernama CreateFile.sh) ke /etc/init.d/CreateFile. Saya kemudian membuat symlink di /etc/rc0.d/ dan /etc/rc6.d/:

sudo ln -s /etc/init.d/CreateFile K99Dave

Saya tidak yakin tentang nama yang tepat untuk symlink tersebut. Beberapa situs web mengatakan "Mulai nama file dengan K", ada yang mengatakan "mulai dengan S", ada yang berkata: "mulai dengan K99 sehingga berjalan pada waktu yang tepat"...

Saya akhirnya mencoba semua hal berikut (tentu saja tidak sekaligus, tetapi satu per satu):

sudo ln -s /etc/init.d/CreateFile S00Dave
sudo ln -s /etc/init.d/CreateFile S99Dave
sudo ln -s /etc/init.d/CreateFile K00Dave
sudo ln -s /etc/init.d/CreateFile K01rpa
sudo ln -s /etc/init.d/CreateFile K99Dave

Setelah membuat setiap symlink, saya selalu menjalankan:

sudo chmod a+x /etc/init.d/CreateFile && sudo chmod a+x /etc/rc6.d/<name of symlink>

Saya kemudian reboot setiap kali.

Setiap kali, file di /home/pi/ShutdownFileTest.txt tidak dibuat; skrip tidak dijalankan.

Saya menemukan komentar ini di postingan lama, yang menyarankan bahwa di atas adalah metode yang ketinggalan jaman:

Cara modern untuk melakukan ini adalah melalui systemd. Lihat "man systemd-shutdown" untuk detailnya. Pada dasarnya, letakkan skrip shell yang dapat dieksekusi di /lib/systemd/system-shutdown/. Argumen seperti "halt" atau "reboot" akan diberikan yang memungkinkan Anda membedakan berbagai kasus jika perlu.

Saya menyalin skrip saya ke /lib/systemd/system-shutdown/, chmod +x, dan mem-boot ulang, tetapi masih belum berhasil.

Saya perhatikan komentar di atas mengatakan bahwa skrip dilewatkan "berhenti" atau "reboot" sebagai argumen. Karena ini harus berjalan secara identik dalam kedua kasus, saya berasumsi bahwa argumen tersebut tidak perlu benar-benar ditangani. Saya juga tidak tahu bagaimana menghadapi argumen itu, jadi saya tidak yakin apakah saya perlu melakukan sesuatu agar argumen itu berhasil atau tidak...

Bisakah seseorang memberi tahu saya di mana kesalahan saya?

Terima kasih sebelumnya, Dave


person ZPMMaker    schedule 12.12.2018    source sumber


Jawaban (2)


Ternyata, sebagian dari perintah shutdown telah dijalankan (dan melepas sistem file) sebelum skrip ini dijalankan.

Oleh karena itu, perlu memasang sistem file di awal skrip dan melepasnya di akhir.

Cukup tambahkan:

mount -oremount,rw /

...di awal skrip (di bawah #!/bin/bash)

...lalu dapatkan kode skripnya...

dan kemudian selesaikan skrip dengan:

mount -oremount,ro /

Jadi, skrip OP harus menjadi:

#!/bin/bash
mount -oremount,rw /
touch /home/pi/ShutdownFileTest.txt
mount -oremount,ro /

...yang kemudian membuat file /home/pi/ShutdownFileTest.txt tepat sebelum shutdown/reboot.


Meskipun demikian, mungkin bukan praktik terbaik untuk menggunakan metode ini. Sebaliknya, lebih baik membuat layanan yang berjalan setiap kali komputer hidup dan berjalan normal, tetapi menjalankan skrip yang diinginkan ketika layanan dihentikan (yang terjadi saat shutdown/reboot).

Hal ini dijelaskan secara detail di sini, namun pada intinya:

1: Buat file (sebut saja example.service).

2: Tambahkan yang berikut ini ke example.service:

[Unit]
Description=This service calls shutdownScript.sh upon shutdown or reboot.

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=/home/pi/shutdownScript.sh

[Install]
WantedBy=multi-user.target

3: Pindahkan ke direktori yang benar untuk systemd dengan menjalankan sudo mv /home/pi/example.service /etc/systemd/system/example.service

4: Pastikan skrip yang diluncurkan saat dimatikan memiliki izin yang sesuai: chmod u+x /home/pi/shutdownScript.sh

5: Mulai layanan: sudo systemctl start example --now

6: Jadikan layanan dimulai secara otomatis saat boot: sudo systemctl enable example

7: Hentikan layanan: sudo systemctl stop example

Perintah terakhir ini akan meniru apa yang terjadi secara normal ketika sistem dimatikan, yaitu perintah tersebut akan menjalankan /home/pi/shutdownScript.sh (tanpa benar-benar mematikan sistem).

Anda kemudian dapat melakukan boot ulang dua kali dan ini akan berfungsi mulai dari reboot kedua dan seterusnya.

EDIT: tidak, tidak. Ini berfungsi saat pertama kali saya mengujinya, tetapi berhenti berfungsi setelah itu. Tidak yakin mengapa. Jika saya menemukan cara untuk membuatnya berfungsi, saya akan mengedit jawaban ini dan menghapus pesan ini (atau jika orang lain mengetahuinya, silakan mengedit jawabannya untuk saya).

person ZPMMaker    schedule 12.12.2018

Karena saya tidak memiliki cukup senioritas untuk mengirim komentar, ini adalah jawaban baru yang saya mohon maaf.

Saya menambahkan satu langkah ke jawaban ZPMMaker dan tampaknya setidaknya berhasil bagi saya.

sudo chmod u+x /etc/systemd/system/example.service
person Torben Jakobsen    schedule 16.04.2019