LINUX.ORG.RU

Юнит не стартует при загрузке

 , ,


0

1

Для обхода блокировок использую ssh tunnel. Команду:

autossh -M 0 -ND 1080 -o TCPKeepAlive=yes -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" user@host -i /home/user/.ssh/key_rsa

Для того чтобы команда автоматически запускалась при старте решил использовать возможности systemd. Создал файл ~/.config/systemd/user/autossh.service

[Unit]
Description=AutoSSH service for a reverse tunnel from some.example.com to localhost
After=network-online.target
After=networking.service

[Service]
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -ND 1080 -o TCPKeepAlive=yes -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" user@host -i /home/user/.ssh/key_rsa
[Install]
WantedBy=multi-user.target 

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

systemctl --user restart autossh.service

Собстенно вопрос: подскажите что надо сделать чтобы данный сервис автоматически стартовал при загрузке системы.

P.S. Кастую intelfx как спеца по данному вопросу

★★★

Так у тебя ~/.config/systemd/user или multi-user.target? В systemd --user дефолтный юнит называется default.target.

И ещё да, зависимости между юнитами из основного systemd и пользовательского не работают.

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

Лучше запускай эту штуку как системный юнит, только укажи User=/Group= (чтобы не стартовать её от рута).

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

зависимости между юнитами из основного systemd и пользовательского не работают.

Правильно ли я понимаю что юнит надо положить в /etc/systemd/system?

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

Это решение мне не нравится, смысл если это можно сделать с помощью systemd ?

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

Главное будет ли он стартовать после перезагрузки ?

Еще хотелось бы чтоб он стартовал только при наличии сети, для чего и прописал

After=network-online.target

Wind ★★★
() автор топика

И ещё: сам по себе network-online.target ничего не делает. Во-первых, тебе нужно явно этот юнит потребовать (Wants=network-online.target), а во-вторых — добавить в зависимости к этому юниту ту утилиту, которая будет непосредственно ожидать поднятия сети (NetworkManager-wait-online.service, systemd-networkd-wait-online.service или что-либо ещё в зависимости от того, чем ты поднимаешь сеть).

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

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

Положил юнит в /etc/systemd/system/autossh.service

[Unit]
Description=AutoSSH service for a reverse tunnel from some.example.com to localhost
After=network.target
After=networking.service

[Service]
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -ND 1080 -o TCPKeepAlive=yes -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" user@host -i /home/user/.ssh/key_rsa
User=user
Group=user

[Install]
WantedBy=multi-user.target 

Активировал и запустил командами

sudo systemctl enable autossh.service
sudo systemctl start autossh.service
Все замечательно, после перезагрузки юнит работает.

Но хотелось бы уточнить один момент, правильно ли я понимаю что хоть юнит и стартует с правами root сама команда запускается от пользователя указанного в User=user ? И что будет если в систему залогиниться пользователь user2 ? Юнит не выполнится, или будет висеть в фоне ?

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

systemd (PID 1) запускается с правами root (очевидно); все команды, указанные в юните, запускаются с правами указанного пользователя.

Если указанный пользователь потом (или до этого) залогинится в систему, ничего страшного не произойдёт — в Linux любому пользователю разрешается иметь сколько угодно процессов ;)

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

Да, и ещё.

Еще хотелось бы чтоб он стартовал только при наличии сети, для чего и прописал
After=network-online.target

Это делается не так. В настоящий твой юнит будет стартовать всегда при запуске системы, а если сети не будет — то autossh просто будет фейлиться.

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

Большое спасибо за помощь и объяснения.

Помечаю тему как решенную.

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