Почему два схожих скрипта (сервиса) при запуске записывают разные сообщения в лог?

Здравствуйте, уважаемые эксперты! 

У меня на Ubuntu 22.04 развернуто два сервиса, каждый из которых запускает свой модуль на Python. 

Файлы .service для этих сервисов идентичны, за исключением имени вызываемого скрипта. Один из файлов был создан путем копирования другого с изменением имени. С точки зрения опыта в *никсах, я следую рабочему примеру, пока он меня устраивает. 

Оба файла .service содержат строку, которая выглядит примерно так: 
```
ExecStart=/bin/bash /usr/myprojects/project1/scripts/function1.sh
```
Кроме того, рабочие каталоги для обоих скриптов одинаковые. 

Скрипты начинаются со следующих строк: 
```
#!/bin/bash
cd /usr/myprojects/project1
source /usr/myprojects/project1/venv/bin/activate
```
Один из скриптов также был создан путем копирования и редактирования.

Однако в результатах команд `systemctl status` и `journalctl` я наблюдаю различия в поведении. Например, для первого сервиса в журнале указано: 
```
Nov 02 14:46:25 fignya.ru systemd[1]: Started HisService1.
``` 
А для второго сервиса: 
```
Nov 02 14:46:43 fignya.ru systemd[1]: Started HisService2.
Nov 02 14:46:43 fignya.ru bash[383494]: /usr/myprojects/project1/function2.sh: line 1: #!/bin/bash: No such file or directory
```

Меня беспокоит эта разница в поведении схожих объектов. Есть ли возможность, что это может оказаться важным или полезным? 

Спасибо за то, что уделили время на чтение моего вопроса.
  • 2 ноября 2024 г. 14:32
Ответы на вопрос 2
Здравствуйте!

Согласно вашему описанию, проблема, с которой вы столкнулись, связана с тем, что один из скриптов не может найти интерпретатор `/bin/bash`, что приводит к ошибке. Это может быть вызвано несколькими причинами.

1. **Проблема с файлами и их содержимым**: Проверьте, действительно ли оба скрипта (например, `function1.sh` и `function2.sh`) содержат корректные строки шебанга. Убедитесь, что они действительно начинаются с `#!/bin/bash`. Иногда могут быть невидимые символы или пробелы перед этой строкой, которые могут мешать правильному интерпретированию.

    Откройте скрипт проблемного сервиса в текстовом редакторе и убедитесь, что строчка начала соответствует стандарту.

2. **Разрешения на выполнение**: Убедитесь, что скрипт `function2.sh` имеет права на выполнение. Вы можете задать права с помощью команды:
    ```bash
    chmod +x /usr/myprojects/project1/function2.sh
    ```

3. **Правильность пути**: Убедитесь, что путь к скрипту правильно указан в `ExecStart`. Если вы скопировали файл `.service` и изменили только имя вызываемого скрипта, убедитесь, что вы не пропустили изменения в самом пути.

4. **Содержимое скрипта**: Проверьте, используется ли в `function2.sh` какой-либо код, который может зависеть от окружения или переменных, и может вызывать ошибки. Возможно, при копировании скрипта были забыты определенные части кода.

5. **Использование относительных путей**: Убедитесь, что все пути внутри скрипта или пути к файлам и директориям прописаны правильно и не содержат ошибок.

6. **Сообщения об ошибках**: Смотрите также на подводящие строки к ошибке в журнале (`journalctl`). Они могут дать хорошее представление о проблеме.

Попробуйте эти шаги для диагностики и решения проблемы. Если проблема сохраняется, возможно, будет полезно запустить скрипт вручную из терминала, чтобы посмотреть, возникают ли ошибки или нет.
Удалите первую строчку #!/bin/bash и напечатайте заново
Похожие вопросы