LINUX.ORG.RU
ФорумAdmin

автозагрузка скрипта

 , ,


0

2

Доброго времени суток! Пытаюсь разобраться с автозагрузкой и никак не выходит. OS Debian 9,9 Есть скрипт который прописывает route выгружает мой драйвер(если был загружен ранее ) и загружает его. Из под sudo скрипт работает корректно. Не из под sudo не выполняется так как insmod требует привилегий. Из под пользователя через sudo тоже работает. chmod 777 run.sh сделал, #!/bin/bash в скрипте также не забыл. Зашел под su, выполнил crontab -e и добавил

@reboot root echo "test" > \home\efrat\test.txt
@reboot root \home\efrat\drv_w\run.sh

После перезагрузки test.txt появляется но драйвер не загружен. Попробовал sudo systemctl restar cron и драйвер прогрузился. Подскажите пожалуйста чем такой запуск отличатся от автоматического? Там по окружению между пользователем и sudo разницы не увидел. Прошу совета.



Последнее исправление: Harvat (всего исправлений: 2)
Ответ на: комментарий от Harvat

Я не спец, все мои юниты написаны методом тыка, мне лень тревожить по таким вопросам местных знатоков, всё в общем гуглится.

а через systemctl restart my.service всё работает

Ну вот, отсюда какой вывод?! Либо надо писать грамотно юнит, чтобы он дождался нужной инициализации чего-то там, либо тупо поставить задержку на запуск ;-)

papin-aziat ★★★★★
()
Ответ на: комментарий от papin-aziat

мне лень тревожить по таким вопросам местных знатоков

Боитесь, что zabbal назовет дебилом, а intelfx внесет в блокнотик? Хотел автору предложить добавить тег systemd, но с такими списялистами лучше ну его нафиг.

bread
()
Ответ на: комментарий от bread

Боитесь, что zabbal назовет дебилом, а intelfx внесет в блокнотик?

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

Про zabbal’а не знаю, не пересекался пока ещё, а intelfx солидный спец, судя по риторике, но он не из тех к кому надо обращаться по поводу десктопа.

Короче мы обитаем в разных мирах и я не боюсь.

papin-aziat ★★★★★
()

Что за бекслеши? \ в Linux не используется, делай с нормальным / и всё. Даже если через совместимость работает, то так правильнее.

Ну и вообще, сделай уже красиво:

Размести свой скрипт в /opt/name/ или в /usr/local/bin/

Потом создай в /etc/systemd/system/ файл своего юнита, там пропиши что-то вроде:

[Unit]
Description=A simple oneshot service

[Service]
Type=oneshot
ExecStart=/bin/bash -c "echo Hello world"
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

После чего systemctl enable my-unit.service и всё.

А вообще в параметрах юнита можно многое указать, чтобы запускался до загрузки сети, например.

Vsevolod-linuxoid ★★★★★
()
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 1)
Ответ на: комментарий от Harvat

я ставил After=network.target Сам драйвер работает с pci

Как я понял, там чёрт ногу сломит, ибо системд спроектирован на параллельный запуск всего, что можно, ради ускорения, так что я в этом лесу блуждать не собираюсь ради простых задач, а воспользуюсь штатными возможностями отложенного запуска, раз уж всё — как ты писал выше — гарантированно работает.

Как говорил один специалист по медитации: «признайте в себе уродство и вы сможете творить красоту» ;-)

papin-aziat ★★★★★
()
Ответ на: комментарий от Vsevolod-linuxoid
#!/bin/bash
ip route add 255.255.255.255/32 dev eth1
rmmod dma_p_drv
cd /home/efrat/drv_w/
insmod dma_p_drv.ko
exit 1

Вот и весь код. Распределять по папкам мне не нужно, это не финальная версия, и для компиляции удобнее когда все проекты по папкам соответственно. Вопрос мой заключался не в том что лучше cron или systemctl, а в том почему автозагрузка не происходит а при рестарте того-же cron всё отрабатывает. Кроме как окружение и порядок загрузки разницы не вижу. А как понять почему я не знаю.

Harvat
() автор топика
Ответ на: комментарий от Vsevolod-linuxoid

Вот нахрена эти юниты городить, если можно записать одну строчку в rc.local. Вернее можно было раньше, потому что адепты поттеринга выжигают rc.local, чем-то он им не угодил, слишком просто наверно. Хотя в альте все еще работает из коробки. В дебиане уже нужно приседать.

bread
()
Последнее исправление: bread (всего исправлений: 1)
Ответ на: комментарий от Harvat

Чувак, ну ты блин альтернативщик. У тебя задача:

  • Запретить загрузку одного модуля ядра
  • Загружать другой
  • Добавить настроек сетевому интерфейсу

Вопрос: нахера писать самопальный скрипт, если всё это прекрасно настраивается штатными методами?

Vsevolod-linuxoid ★★★★★
()
Ответ на: комментарий от SpaceRanger

В итоге все разрешилось написанием такого юнита: [Unit] Description=pcidma After=network-online.target Wants=network-online.target [Service] ExecStart=/bin/bash -c «/home/efrat/drv_w/run.sh» [Install] WantedBy=multi-user.targetСпасибо за наводку) Ключевым тут оказались значения After and Wants

Harvat
() автор топика
Ответ на: комментарий от Harvat

Хотя бы в /etc/motd добавь инфу о своих костылях для грядущих админов. Это само по себе очень плохо — вместо нормальных настроек штатными методами писать самопальные скрипты в хомяке, но не документировать такое это практически саботаж — будет очень сложно понять, что и как ты навертел.

В Linux есть стандартные способы настроек, и отступать от них нежелательно, так как те, кто придут за тобой, будут в первую очередь там смотреть, а не выискивать по всей системе неведомо что.

Vsevolod-linuxoid ★★★★★
()