Вопрос или проблема
Я запускаю скрипт /home/bernard/p1meter/getdate.sh
из терминала, который выдает ошибку на первой команде cd
(строка 3 в скрипте)!
#!/bin/sh
pwd
cd /home/bernard/p1meter
Я добавил команду pwd
в скрипт, чтобы узнать, какой у меня текущий каталог во время выполнения скрипта. Это “https://superuser.com/” (смотрите в результате journalctl
)
Скрипт запускается с помощью следующей команды systemd
sudo systemctl start getdata.service
Скрипт оболочки запускается, но выдает ошибку на первой команде cd
В результате journalctl
я вижу следующие строки
The job identifier is 23045.
Dec 10 08:47:40 raspberrypi sh[20217]: [49B blob data]
Dec 10 08:47:40 raspberrypi sh[20217]: /
Dec 10 08:47:40 raspberrypi sh[20217]: /home/bernard/p1meter/getdata.sh: 4: cd: can't cd to /home/bernard/p1meter
Почему мой скрипт не находит каталог /home/bernard/p1meter
?
Когда я подключен как bernard
, команда ls /home/bernard/p1meter
работает корректно!
bernard@raspberrypi:~ $ ls /home/bernard/p1meter
data getdata.py3 getdata.service getdata.sh
bernard@raspberrypi:~ $
Файл конфигурации getdata.service
, используемый systemd
, содержит следующие строки
[Unit]
Description=Start extraction of P1 meter data
[Service]
ExecStart=/bin/sh /home/bernard/p1meter/getdata.sh
[Install]
WantedBy=multi-user.target
Ответ или решение
Как задать текущую директорию в shell-скрипте, запущенном через systemd
При запуске скриптов с помощью systemd важно учитывать, что они выполняются в контексте службы, который может отличаться от пользовательского окружения. Если ваш скрипт /home/bernard/p1meter/getdata.sh
не может выполнить команду cd
для перехода в /home/bernard/p1meter
, это может быть связано с тем, что service unit не имеет правильных прав или контекста для доступа к указанной директории.
Проблема
Ваша проблема связана с тем, что скрипт запускается через systemd. Поэтому, когда вы используете команду cd
, путь к директории, возможно, не распознается из-за невозможности доступа к ней из контекста службы. Сообщение об ошибке:
cd: can't cd to /home/bernard/p1meter
указывает на то, что директория либо недоступна, либо путь указан некорректно.
Решение
Для того чтобы правильно указать текущую директорию при запуске скрипта через systemd, необходимо скорректировать файл конфигурации вашего сервиса. Вот несколько шагов для исправления ситуации:
-
Проверьте права доступа: Убедитесь, что у пользователя, под которым работает systemd, есть доступ к директории
/home/bernard/p1meter
. Если ваш service unit исполняется от имени пользователя, отличного отbernard
, это может вызвать проблемы с доступом. -
Установите рабочую директорию в файле конфигурации: В вашем unit файле (
getdata.service
), добавьте опциюWorkingDirectory
, чтобы явно указать, в какой директории должен быть запущен ваш скрипт. Измените ваш конфигурационный файл следующим образом:[Unit] Description=Start extraction of P1 meter data [Service] WorkingDirectory=/home/bernard/p1meter ExecStart=/bin/sh /home/bernard/p1meter/getdata.sh [Install] WantedBy=multi-user.target
-
Перезагрузите конфигурацию systemd: После внесения изменений в файл конфигурации вам нужно перезагрузить systemd для применения этих изменений. Используйте следующую команду:
sudo systemctl daemon-reload
-
Запустите службу: Теперь вы можете снова запустить вашу службу:
sudo systemctl start getdata.service
-
Проверьте статус службы: Для проверки, прошло ли всё успешно, используйте команду:
sudo systemctl status getdata.service
Заключение
Использование WorkingDirectory
в вашем unit файле systemd обеспечит правильную текущую директорию, когда ваш скрипт будет выполняться. Это позволит избежать ошибки, связанной с командой cd
, и обеспечит корректное выполнение скрипта. Убедитесь, что у вашей службы есть все необходимые разрешения для доступа к директории.
Следуя этим шагам, вы сможете настроить выполнение вашего скрипта так, чтобы избежать сбоев и обеспечить его надлежащее выполнение в контексте systemd.