Здравствуйте.
Сразу хочу сказать, что только начинаю осваивать Linux, поэтому прошу не быть строгими.
Проблема: создал юнит где в строке ExecStart указан абсолютный путь до скрипта. Сам скрипт исполняется. Путь до него сто раз проверил.
Юнит через systemctl enable включил в автозагрузку. При старте системы ничего не происходит. Смотрю лог, а там написано "нет такого файла". Но он есть.
Чё ему надо?
ExecStart не видит файл
Чё ему надо?
Здравствуйте. Если скрипт и юнит не представляют государственной тайны, то есть смысл опубликовать их + лог и путь к юниту.
Права все установил?
Скрипт такой (задача присоединить файл к loop устройству и потом его смонтировать). Расположение файла /home/pit имя runVFS.sh
#! /bin/sh
var1=`sudo losetup -f` # (переменной присваиваю номер свободного loop)
sudo losetup $var1 ~/VirtualFS # (присоединяю к устройству)
sudo mount -t ext3 $var1 ~/Newpoint # (монтирую)Если запускаю скрипт из командной строки, то все отлично работает.
Далее создаю юнит runVFS.service в папке /etc/systemd/system
[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]
А что пишет журнал?
Команда [console]systemctl status runVFS[/console]
И после
[console]systemctl enable runVFS[/console]
запустить сервис
[console]systemctl start runVFS[/console]
/home/pit/runVFS.sh:
#!/bin/bash
var1=$(losetup -f)
losetup $var1 /home/pit/VirtualFS
mount -t auto $var1 /home/pit/Newpoint
/etc/systemd/system/runVFS.service:
[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:
#!/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:
[Unit]
Description=Run
[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c 'losetup $(losetup -f) /home/pit/VirtualFS'
[Install]
WantedBy=multi-user.target
и перезагружаемся...
Не знаю, как ещё можно поизгаляться. Может быть мужики ещё что-нибудь дополнительно нарисуют...
p.kovshevojj, у меня один вопрос. А зачем Вы системную службу в профиль пользователя размещаете? Не лучше /usr/bin или куда-то ещё?
P.S. Подправил Ваше сообщение, используйте BB-коды для оформления.
Огромное спасибо за помощь.
Исправил скрипт и юнит как написал alex_q_2000 и все заработало.
Вот сижу и думаю, а чего принципиально изменилось?
В скрипте вместо sh написали bash
Переменной присвоили значение не устаревшим, а современным способом
Он при старом варианте выполнялся, значит дело не в нем.
В юните Type=idle заменен на oneshot
В чем был секрет - не понял. *WALL*
Но еще раз огромное преогромное спасибо за оперативную помощь.
p.s. обучаюсь на курсах. Преподаватель доктор наук так грузит, что башка кругом. Но ничего, прорвемся.
p.kovshevojj, sh и bash разные команды сценариев.
Sh - запускает сценарий .shell для запуска бинарных подпрограмм (аналогично файлам .bat в Windows) и запускаться внутри скрипта не может.
Bash - запускает сценарий оболочки bash, которая позволяет управлять службами, скриптами и пр.
В чем был секрет - не понял
Всё упирается в sudo:
---
1. Ваш юнит запускает скрипт от юзера (User=pit). В скрипте есть sudo, а пароль в момент выполнения скрипта вводить некому. Поэтому блочными устройствами и монтированием должен заниматься тот, кому пароль не нужен, т.е. root (по умолчанию). Ему, соответственно, нужны абсолютные пути, а не тильда.
2. Шебанг-строка обычно не содержит пробелов (#! /bin/sh), обратные кавычки - отстой (``), а #!/bin/bash обеспечивает переносимость скриптов между попсовыми линуксами + имеет расширенную поддержку синтаксиса (echo -e .., [[ .. ]] и т.п.). В общем: #!/bin/bash - rulezz, #!/bin/sh - suxx.
3. Здесь Вы найдёте описание типов сервисов systemd...
Sh - запускает сценарий .shell для запуска бинарных подпрограмм (аналогично файлам .bat в Windows) и запускаться внутри скрипта не может.
Bash - запускает сценарий оболочки bash, которая позволяет управлять службами, скриптами и пр.
На самом деле bash тоже shell, только более навороченный.
На самом деле bash тоже shell, только более навороченный.
Вот и нет. Shell - лишь один из сценариев оболочки Bash. Служит для запуски скриптов и бинарных файлов.
Так же ему подчиняются все установленные библиотеки.
Bash же - является многоуровневой средой со своими службами, языком внутренних команд. Так же может выполнять роль интерпретатора (при установке соответствующих пакетов) для ЯП Python, Perl, C++, GNU Assembler.
Shell - лишь один из сценариев оболочки Bash.
Командная оболочка и есть по компьютерному shell.
Bourne again shell
Господа, зачем спорить?
Shell :
- "...Это интерпретатор команд LINUX, который, хотя и не является частью операционной системы, интенсивно использует многие функции операционной системы и, таким образом, служит хорошим примером того, как можно использовать системные вызовы. Это также основной интерфейс между пользователем за терминалом и операционной системой..." Сайт educba.com
- "...Shell предоставляет пользователю интерфейс к системе Unix. Получает от вас данные и на их основе выполняет программы. Когда программа завершает выполнение, shell отображает вывод этой программы.
Shell - это среда, в которой мы можем запускать команды, программы и сценарии оболочки. Есть разные варианты оболочки, так же как существуют разные варианты операционных систем. У каждой разновидности оболочки есть свой собственный набор распознаваемых команд и функций..." Сайт tutorialspoint.com
Не? *SCRATCH*