LINUX.ORG.RU

Автозапуск бинарника

 , ,


1

1

Есть Raspberry Pi 3 B с установленной Raspbian Jessie. На Go написано многопоточное приложение. Скомпилил его в бинарник, параметры компиляции указывал верные. Если запускать его из консоли, так:

./main
то никаких проблем не происходит, все без каких-либо ошибок запускается, вывод можно перенаправить. Но вот из /etc/rc.local он никак запускаться не хочет. И перенаправление вывода не работает, пробовал все: 1 >, 2 >, & >. С ними выполнение останавливается, а вывод все еще лезет в консоль. Пробовал и вообще убирать вывод в консоль из кода, не помогло. Раньше был скрипт на питоне, выполняющий те же функции, все работало. Флаг -e убирать пробовал. exit 0 тоже пробовал убирать. Права доступа менял, сейчас стоит 777. /etc/rc.local:
#!/bin/sh
#С флагом -e тоже пробовал
cd /home/pi/Jessy #Это обязательно, иначе бинарник не найдет файлы
./main #Запуск безе перенаправления (чтобы не закрывался)
exit 0 #Пробовал и убирать, ничего не меняется
Если запускать так:
/etc/rc.local
то все работает. При запуске rc.local работает. Пробовал и добавлять скрипт запуска бинарника в /etc/init.d. Как же можно прописать скрипт в автозагрузку?

Raspbian Jessie

Как же можно прописать скрипт в автозагрузку?

Systemd

Radjah ★★★★★
()

У CentOS 7 скрипт rc.local есть в /etc/init.d , но на него по умолчанию не стоят права на исполнение.

Возможно и тут что-то подобное?

slamd64 ★★★★★
()

Вроде все сделал, написал systemd-сервис, прописал в автозагрузку, но все равно не запускается. Скрипт запуска выполняется, но выполнение бинарника он проскакивает. А вот если вручную написать

systemctl start jessy
то сервис запускается, и все прекрасно работает. А вот при запуске бинарник не выполняется. Код скрипта:
#!/bin/sh
cd /home/pi/Jessy
touch test #Он создается
./main #А это не выполняется
exit 0

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

Вот вывод команды «systemctl status jessy»

● jessy.service - Run Jessy binary
   Loaded: loaded (/etc/systemd/system/jessy.service; enabled)
   Active: inactive (dead) since Wed 2017-05-03 08:49:59 UTC; 33s ago
  Process: 510 ExecStart=/home/pi/Jessy/run.sh (code=exited, status=0/SUCCESS)
 Main PID: 510 (code=exited, status=0/SUCCESS)

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

Посмотрел в journalctl, падет именно сам бинарник. Падает из-за чего-то с сетью. Мне кажется, что он загружается слишком рано. Если в уже загруженной системе написать «sudo systemctl start jessy», то все поднимается без каких-либо ошибок. Есть ли какие-либо способы указать загрузку моего сервиса после всех остальных (иксы не стартуют, пользователь логиниться не должен)? Вот конфиг:

[Unit]
Description=start binary
DefaultDependences=no
Requires=network.target
After=network.target

[Service]
Type=simple
ExecStart=/home/pi/Jessy/run.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
С запуска network.target до запуска моего скрипта проходит 150 мс. Этого достаточно для подключения к wi-fi? Или же network.target подразумевает подключение?

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

Тебе надо писать в [Unit]:

Wants=network-online.target
After=network.target network-online.target
И включить systemd-networkd и systemd-networkd-wait-online.

Но тогда надо всю сеть на управление systemd-networkd переводить, потому что network-online будет срабатывать тут же.

Я бы написал как-то так:

[Unit]
Description=start binary
Wants=network-online.target
After=network.target network-online.target

[Service]
WorkingDirectory=/home/pi/Jessy
ExecStartPre=/usr/bin/touch test
ExecStart=/home/pi/Jessy/main
Restart=on-failure

[Install]
WantedBy=multi-user.target

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

Попрорбовал перенести сеть на systemd-nrtworkd, как-то не очень. Возможно ли сделать так, чтобы скрипт запускался только через несколько секунд после network.target? Мне кажется, это решит проблему

AUgryumov
() автор топика

Костыль вставлен, все работает. Просто поставил sleep перед запуском бинарника. Получился вот такой конфиг:

[Unit]
Description=Jessy binary
Wants=network-online.target
After=network.target network-online.target

[Service]
WorkingDirectory=/home/pi/Jessy
ExecStartPre=/bin/sleep 5
ExecStart=/home/pi/Jessy/main
Restart=on-failure

[Install]
WantedBy=multi-user.target
Всем огромное спасибо за помощь!

AUgryumov
() автор топика

эти ваши хвалёные systemd

das_tier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.