Как запустить скрипт Bash перед выключением или перезагрузкой Raspberry Pi (с Raspbian)? - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу запустить скрипт Bash перед выключением или перезагрузкой моего Pi (с последним Raspbian, производным от Debian).

например, если я ввожу команду sudo shutdown now или sudo reboot сейчасВ командной строке следует запустить мой сценарий Bash, прежде чем продолжить работу с shutdown / reboot.

Я создал очень простой сценарий только для тестирования, чтобы убедиться, что метод работает до того, как я начну писать настоящий сценарий:

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

Затем я скопировал файл (называемый CreateFile.sh) в /etc/init.d/CreateFile. Затем я создал символические ссылки в /etc/rc0.d/ и /etc/rc6.d/:*1008.*

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

Я не уверен, каким должно быть правильное наименование символической ссылки.Некоторые веб-сайты говорят «Начните имя файла с K», некоторые говорят «начинайте с S», один сказал: «начинайте с K99, чтобы он работал в нужное время» ...

Я на самом деле пыталсявсе следующие (конечно, не все сразу, а по одному):

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

После создания каждой символической ссылки я всегда выполнял:

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

Затем я перезагружалсякаждый раз.

Каждый раз, файл в /home/pi/ShutdownFileTest.txt не создавался;скрипт не выполняется.

Я нашел этот комментарий в более старом посте, предполагая, что вышеупомянутый был устаревшим методом:

Современный способ сделатьэто через systemd.Смотрите "man systemd-shutdown" для подробностей.По сути, поместите исполняемый скрипт оболочки в / lib / systemd / system-shutdown /.Ему передается аргумент типа «остановка» или «перезагрузка», который позволяет вам различать различные случаи, если вам нужно.

Я скопировал свой скрипт в / lib / systemd / system-shutdown /,chmod + x'd его и перезагрузил, но все равно безуспешно.

Я отмечаю, что в приведенном выше комментарии говорится, что сценарию передается "halt" или "reboot" в качестве аргумента.Поскольку он должен работать одинаково в обоих случаях, я полагаю, что он не должен иметь дело с этим аргументом.Я тоже не знаю, как справиться с этим аргументом, поэтому я не уверен, нужно ли мне что-то делать, чтобы это сработало или нет ...

Может кто-нибудь сказать, где я?идет не так?

Заранее спасибо, Дейв

Ответы [ 2 ]

0 голосов
/ 16 апреля 2019

Поскольку мне не хватает сеньоры, чтобы оставлять комментарии, это новый ответ, за который я приношу свои извинения.

Я добавил шаг к ответу ZPMMaker , и, похоже, он работаетпо крайней мере для меня.

sudo chmod u+x /etc/systemd/system/example.service
0 голосов
/ 12 декабря 2018

Как оказалось, часть команды shutdown уже была выполнена (и размонтирована файловая система) до выполнения этих сценариев.

Следовательно, монтируем файловую систему в начале сценария и размонтируем ее вконец необходим.

Просто добавьте:

mount -oremount,rw /

... в начале скрипта (под #! / bin / bash)

...затем получите код сценария ...

и затем завершите сценарий с помощью:

mount -oremount,ro /

Итак, сценарий OP должен стать:

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

...затем он создает файл /home/pi/ShutdownFileTest.txt непосредственно перед выключением / перезагрузкой.


Тем не менее использование этого метода может оказаться нецелесообразным.Вместо этого лучше создать службу, которая запускается всякий раз, когда компьютер включен и работает нормально, но запускает нужный сценарий, когда служба завершается (что происходит при завершении работы / перезагрузке).

Это подробно объясняется здесь , но по существу:

1: создать файл (назовем его example.service).

2: добавить следующее в 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: Переместите его в правильный каталог для systemd, запустив sudo mv /home/pi/example.service /etc/systemd/system/example.service

4: Убедитесь, что скрипт, запускаемый при завершении работы, имеет соответствующие разрешения: chmod u+x /home/pi/shutdownScript.sh

5: Запустить службу: sudo systemctl start example --now

6: Запустить службу автоматически при загрузке: sudo systemctl enable example

7: Остановить службу: sudo systemctl stop example

Это последнееКоманда будет имитировать то, что обычно происходит, когда система выключается, т.е. она запускает /home/pi/shutdownScript.sh (без фактического выключения системы).

Затем можно дважды перезагрузиться, и она должна работать извторая перезагрузка вперед.

РЕДАКТИРОВАТЬ: Нет, нет, это не так.Это сработало в первый раз, когда я его проверил, но после этого перестал работать.Не уверен почему.Если я выясню, как заставить его работать, я отредактирую этот ответ и удалю это сообщение (или, если кто-то другой знает, пожалуйста, не стесняйтесь редактировать ответ для меня).

...