LinuxForum.Fans
Тема

ExecStart не видит файл

Автор: p_kovshevojj 14 сообщений 2234 просмотров
11.05.2021 16:28 #436314

Здравствуйте.
Сразу хочу сказать, что только начинаю осваивать Linux, поэтому прошу не быть строгими.
Проблема: создал юнит где в строке ExecStart указан абсолютный путь до скрипта. Сам скрипт исполняется. Путь до него сто раз проверил.
Юнит через systemctl enable включил в автозагрузку. При старте системы ничего не происходит. Смотрю лог, а там написано "нет такого файла". Но он есть.
Чё ему надо?

11.05.2021 17:49 #436315
"p.kovshevojj" написал:
Чё ему надо?

Здравствуйте. Если скрипт и юнит не представляют государственной тайны, то есть смысл опубликовать их + лог и путь к юниту.

11.05.2021 18:16 #436316

Права все установил?

11.05.2021 23:04 #436320

Скрипт такой (задача присоединить файл к loop устройству и потом его смонтировать). Расположение файла /home/pit имя runVFS.sh

text
#! /bin/sh
var1=`sudo losetup -f` # (переменной присваиваю номер свободного loop)
sudo losetup $var1 ~/VirtualFS # (присоединяю к устройству)
sudo mount -t ext3 $var1 ~/Newpoint # (монтирую)

Если запускаю скрипт из командной строки, то все отлично работает.
Далее создаю юнит runVFS.service в папке /etc/systemd/system

text
[Unit]
Description=Run

[Service] Type=idle ExecStart=/home/pit/runVFS.sh User=pit

[Install] WantedBy=multi-user.target

потом пишу [console]sudo systemctl enable runVFS.service[/console]

12.05.2021 09:55 · отредактировано #436321

А что пишет журнал?
Команда [console]systemctl status runVFS[/console]
И после
[console]systemctl enable runVFS[/console]
запустить сервис
[console]systemctl start runVFS[/console]

12.05.2021 21:15 · отредактировано #436322

/home/pit/runVFS.sh:

text

#!/bin/bash

var1=$(losetup -f) losetup $var1 /home/pit/VirtualFS mount -t auto $var1 /home/pit/Newpoint

/etc/systemd/system/runVFS.service:

text

[Unit]
Description=Run

[Service] Type=oneshot ExecStart=/home/pit/runVFS.sh

[Install] WantedBy=multi-user.target

Добавлено: 12.05.2021 18:34:53

Если нужно монтировать после загрузки + писАть и читать прямо от юзера:
---
...устройство уже смонтировано:
sudo chmod -R 777 /home/pit/Newpoint

Узнаём UUID:
sudo blkid /dev/loop0 (или другой)
бла...бла...UUID="ad1f2c65-d81f-452c-8050-684f68186bfe"...бла

Пишем в /etc/fstab строку:
UUID=ad1f2c65-d81f-452c-8050-684f68186bfe /home/pit/Newpoint ext3 noauto,user,rw 0 0

Изменяем /home/pit/runVFS.sh:

text

#!/bin/bash

var1=$(losetup -f) losetup $var1 /home/pit/VirtualFS

и перезагружаемся...

Добавлено: 12.05.2021 21:15:55

...или вообще без скрипта /home/pit/runVFS.sh, но со строкой в /etc/fstab (см. выше...)

Изменяем /etc/systemd/system/runVFS.service:

text

[Unit]
Description=Run

[Service] Type=oneshot ExecStart=/usr/bin/bash -c 'losetup $(losetup -f) /home/pit/VirtualFS'

[Install] WantedBy=multi-user.target

и перезагружаемся...

Не знаю, как ещё можно поизгаляться. Может быть мужики ещё что-нибудь дополнительно нарисуют...

13.05.2021 07:14 #436343

p.kovshevojj, у меня один вопрос. А зачем Вы системную службу в профиль пользователя размещаете? Не лучше /usr/bin или куда-то ещё?

P.S. Подправил Ваше сообщение, используйте BB-коды для оформления.

14.05.2021 20:31 #436354

Огромное спасибо за помощь.
Исправил скрипт и юнит как написал alex_q_2000 и все заработало.
Вот сижу и думаю, а чего принципиально изменилось?
В скрипте вместо sh написали bash
Переменной присвоили значение не устаревшим, а современным способом
Он при старом варианте выполнялся, значит дело не в нем.

В юните Type=idle заменен на oneshot
В чем был секрет - не понял. *WALL*

Но еще раз огромное преогромное спасибо за оперативную помощь.

p.s. обучаюсь на курсах. Преподаватель доктор наук так грузит, что башка кругом. Но ничего, прорвемся.

16.05.2021 18:51 · отредактировано #436359

p.kovshevojj, sh и bash разные команды сценариев.
Sh - запускает сценарий .shell для запуска бинарных подпрограмм (аналогично файлам .bat в Windows) и запускаться внутри скрипта не может.
Bash - запускает сценарий оболочки bash, которая позволяет управлять службами, скриптами и пр.

17.05.2021 08:35 · отредактировано #436361
"p.kovshevojj" написал:
В чем был секрет - не понял

Всё упирается в sudo:
---
1. Ваш юнит запускает скрипт от юзера (User=pit). В скрипте есть sudo, а пароль в момент выполнения скрипта вводить некому. Поэтому блочными устройствами и монтированием должен заниматься тот, кому пароль не нужен, т.е. root (по умолчанию). Ему, соответственно, нужны абсолютные пути, а не тильда.

2. Шебанг-строка обычно не содержит пробелов (#! /bin/sh), обратные кавычки - отстой (``), а #!/bin/bash обеспечивает переносимость скриптов между попсовыми линуксами + имеет расширенную поддержку синтаксиса (echo -e .., [[ .. ]] и т.п.). В общем: #!/bin/bash - rulezz, #!/bin/sh - suxx.

3. Здесь Вы найдёте описание типов сервисов systemd...

17.05.2021 09:19 #436362
"Wolfenberg" написал:
Sh - запускает сценарий .shell для запуска бинарных подпрограмм (аналогично файлам .bat в Windows) и запускаться внутри скрипта не может.
Bash - запускает сценарий оболочки bash, которая позволяет управлять службами, скриптами и пр.

На самом деле bash тоже shell, только более навороченный.

18.05.2021 17:11 #436370
"ValentinK" написал:
На самом деле bash тоже shell, только более навороченный.

Вот и нет. Shell - лишь один из сценариев оболочки Bash. Служит для запуски скриптов и бинарных файлов.
Так же ему подчиняются все установленные библиотеки.
Bash же - является многоуровневой средой со своими службами, языком внутренних команд. Так же может выполнять роль интерпретатора (при установке соответствующих пакетов) для ЯП Python, Perl, C++, GNU Assembler.

18.05.2021 18:04 · отредактировано #436372
"Wolfenberg" написал:
Shell - лишь один из сценариев оболочки Bash.

Командная оболочка и есть по компьютерному shell.
Bourne again shell

18.05.2021 19:54 · отредактировано #436376

Господа, зачем спорить?
Shell :
- "...Это интерпретатор команд LINUX, который, хотя и не является частью операционной системы, интенсивно использует многие функции операционной системы и, таким образом, служит хорошим примером того, как можно использовать системные вызовы. Это также основной интерфейс между пользователем за терминалом и операционной системой..." Сайт educba.com
- "...Shell предоставляет пользователю интерфейс к системе Unix. Получает от вас данные и на их основе выполняет программы. Когда программа завершает выполнение, shell отображает вывод этой программы.
Shell - это среда, в которой мы можем запускать команды, программы и сценарии оболочки. Есть разные варианты оболочки, так же как существуют разные варианты операционных систем. У каждой разновидности оболочки есть свой собственный набор распознаваемых команд и функций..." Сайт tutorialspoint.com
Не? *SCRATCH*

Войдите или зарегистрируйтесь, чтобы ответить.