Як запустити системну послугу після входу користувача та зупинити її перед виходом користувача


10

У мене є машина Fedora 23.

У мене є сценарій bash для синхронізації каталогу / файлів, який синхронізує мій локальний / домашній каталог з віддаленим каталогом (на машині NAS). Я запускаю його вручну, але я хотів би створити системний сервіс і зробити його більш гнучким, оскільки інші користуються моїм ПК із власними обліковими записами користувачів, я хотів би дізнатися, коли користувач увійшов у систему та запустив службу після цього.

Чи можу я щось зробити із системного файлу моєї служби або мені доведеться перевірити це зі свого коду в сценарії?

Мені потрібно лише переконатися, що у мене є доступ до змінних оточуючих середовищ (наприклад, US USER), і запустити його як службу.

Моє основне джерело документації - це посилання https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html


Чи systemctl --userпрацює на F23?
користувач1686

Я думаю, що так, він повертає список та повідомлення 76 loaded units listed.
GeorgeKaf

Ось ще один підхід, який може працювати для вас: unix.stackexchange.com/a/109270/111707 Напишіть невеликий скрипт Python, який ви запускаєте .bashrcпри вході в систему, після чого він прослуховує сигнал виходу Gnome і вимикається.
Ян Ян

@IanB Дякую, я перевірю. Ніколи не боляче мати щось подібне навколо.
GeorgeKaf

Відповіді:


15

Використовуйте systemd, він вже включає підтримку сеансів користувачів, адже ви вже повинні залежати від нього (мимоволі).

Створіть каталог послуг

mkdir -p $HOME/.local/share/systemd/user

Створіть редагування сервісного файлу (vim, gedit, geany - все, що завгодно)

vim $HOME/.local/share/systemd/user/my.service

Це приблизно повинно виглядати так, якщо це постійне обслуговування.

[Unit]
Description=My very own Service
[Service]
Type=simple
TimeoutStartSec=0
ExecStart=/path/to/start/script arguments
[Install]
WantedBy=default.target

Але це здається, що ви хочете один раз його запустити, тоді будьте добрі з ним, тому скоріше використовуйте конфігурацію onehot, як це:

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/path/to/start/script arguments
ExecStop=/path/to/stop/script arguments
[Install]
WantedBy=default.target

Звичайно, це передбачає, що ваш сценарій виконується, тобто:

chmod a+x /path/to/start/script
chmod a+x /path/to/stop/script

Інакше вам потрібно буде додати шлях до відповідного перекладача:

ExecStart=/bin/bash /path/to/start/script arguments

Тепер перезавантажте systemd (і повторно увійдіть для тестування)

systemctl --user enable my.service # enables the service
systemctl --user # should display your new unit in the list
journalctl --user should show the log

Якщо вам потрібна додаткова інформація, зверніться, наприклад, до Arch-Wiki . Цей потік askubuntu має різні ідеї, в тому числі, моє.

Ви можете поширити поведінку (якщо ви root) на інших користувачів, визначивши послугу в усьому світі. Для цього вам потрібно створити службовий файл у / usr / share / systemd / user / не в $ HOME / .local / share / systemd / user .


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

4
Під час ввімкнення послуги вам потрібен прапор --user. "systemctl --user enable my.service"
blushrt

0

Я знаю це декілька років, але відповідь від anx мені просто допомогла. Отже, я думаю, це все-таки сприймає. Крім того, це більше зауваження, але у мене немає такої привабливості, тому я розміщую це як "відповідь". У будь-якому випадку ...

Запускаючи Linux Mint 19, я не міг "включити" послугу, коли сценарій знаходився у "$ HOME / .local / share / systemd / user". Спроба зробити це завжди призводило до помилки. Однак я міг би запустити його просто з каталогу "$ HOME / .local / share / systemd / user". Після переміщення сценарію в '/ usr / share / systemd / user /', systemd дозволив мені включити його без проблем.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.