Вопрос или проблема
Я пытаюсь запустить .sh файл при загрузке rPi3B+, работающего на openSuse Tumbleweed JeOS. Скрипт очень простой и выглядит так:
node /home/user_name/path/to/the/file.js
Вот две ссылки, которые я пытался просмотреть:
https://forums.opensuse.org/showthread.php/428743-How-to-run-script-at-startup
https://www.suse.com/c/easy-running-scripts-boot-and-shutdown/
https://doc.opensuse.org/documentation/leap/startup/html/book.opensuse.startup/cha.adm.shell.html
Как мне поступить в этой ситуации?
Правка: Я также пробовал следовать этой ссылке, но безуспешно: https://stackoverflow.com/questions/12973777/how-to-run-a-shell-script-at-startup#12973826
Мой startServer
скрипт в /etc/init.d
выглядит так:
#!/bin/sh
# ScriptName=startServer
node /home/user-name/server.js &
/etc/init.d/after.local
Создайте этот файл и вызовите ваш script.sh
из него, он будет выполняться от имени root.
Кроме того, вы можете вызвать его через su -c '/path/yourscript.sh' username
, где username — это любой действующий пользователь.
После полной загрузки системы, если /etc/init.d/after.local
существует, то всё, что в нем находится, будет выполнено. Вы можете использовать chmod 600 /etc/init.d/after.local
и chown root.root /etc/init.d/after.local
, если вас беспокоит безопасность.
Ваш скрипт StartServer в /etc/init.d выглядит так:
/etc/init.d/StartServer.sh
Он содержит
#!/bin/sh
# ScriptName=startServer
node /home/user-name/server.js &
Создайте /etc/init.d/after.local
и его содержимое будет просто
/etc/init.d/StartServer.sh
- После полной загрузки системы, на последнем этапе [это особенность suse] будет попытка исполнить файл
/etc/init.d/after.local
, если он существует - Вы вручную создаете
/etc/init.d/after.local
и помещаете в него/etc/init.d/StartServer.sh
- Ваш скрипт StartServer.sh выполняется после полной загрузки системы.
openSUSE, как Leap, так и Tumbleweed, перешли на systemd
давно. Ничего не должно находиться под /etc/init.d
.
Все сервисы должны поставляться с шаблонами запуска systemd
*.service
, расположенными под /usr/lib/systemd/system
(если нет, вы можете легко создать свой собственный *myserver*.service
под /etc/systemd/system
).
В соответствующем .service файле добавьте строку
ExecStartPost=/usr/bin/sh -c "node /home/user-name/server.js &"
после строки ExecStart=
, которая запускает сервис. Также рассмотрите возможность остановки вашего server.js через соответствующую запись ExecStopPre=
.
Ответ или решение
Для того чтобы запустить bash-скрипт при старте системы на Raspberry Pi 3B+, работающем под управлением openSUSE Tumbleweed JeOS, лучше всего использовать систему инициализации systemd
, которая является стандартной в современных версиях openSUSE.
Вот пошаговая инструкция о том, как это сделать:
Шаг 1: Создайте ваш bash-скрипт
Предположим, ваш скрипт называется startServer.sh
. Его содержимое будет следующим:
#!/bin/bash
# ScriptName=startServer
node /home/user-name/path/to/the/file.js &
Сохраните этот файл и предоставьте ему права на выполнение:
chmod +x /path/to/startServer.sh
Шаг 2: Создайте unit-файл для systemd
Необходимо создать файл службы systemd
. Перейдите к директории /etc/systemd/system
и создайте новый файл, например myserver.service
:
sudo nano /etc/systemd/system/myserver.service
Вставьте в него следующее содержимое:
[Unit]
Description=My Node.js Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/node /home/user-name/path/to/the/file.js
WorkingDirectory=/home/user-name/path/to/
User=user-name
Restart=on-failure
[Install]
WantedBy=multi-user.target
Шаг 3: Включите и запустите службу
После создания файла службы необходимо перезагрузить конфигурацию systemd
и включить службу, чтобы она запускалась при старте системы:
sudo systemctl daemon-reload
sudo systemctl enable myserver.service
sudo systemctl start myserver.service
Шаг 4: Проверьте статус службы
Чтобы убедиться, что ваша служба запущена и работает правильно, используйте команду:
sudo systemctl status myserver.service
Заключение
Теперь ваш скрипт будет автоматически запускаться при загрузке системы на Raspberry Pi под управлением openSUSE Tumbleweed. Если у вас возникнут какие-либо ошибки, вы можете просмотреть логи службы с помощью следующей команды:
journalctl -u myserver.service
Таким образом, вы сможете диагностировать и исправить любые проблемы, которые могут возникнуть.