Cara memulai layanan systemd setelah pengguna masuk dan menghentikannya sebelum pengguna keluar

10

Saya memiliki Mesin Fedora 23.

Saya memiliki skrip bash sinkronisasi direktori / file yang menyinkronkan direktori lokal / home saya ke direktori jarak jauh (di mesin NAS). Saya menjalankannya secara manual tetapi saya ingin membuat layanan systemd dan membuatnya lebih fleksibel, karena orang lain menggunakan PC saya dengan kredensial pengguna mereka sendiri, saya ingin tahu kapan seorang pengguna login dan memulai layanan saya setelah itu.

Apakah ada sesuatu yang dapat saya lakukan dari file systemd layanan saya atau apakah saya harus memeriksanya dari kode saya di skrip?

Saya hanya perlu memastikan bahwa saya memiliki akses ke variabel lingkungan (seperti $ USER) dan menjalankannya sebagai layanan.

Sumber utama dokumentasi saya adalah tautan ini https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html

GeorgeKaf
sumber
Apakah systemctl --userberfungsi pada F23?
user1686
Saya kira begitu, mengembalikan daftar dan pesan 76 loaded units listed.
GeorgeKaf
Berikut pendekatan lain yang mungkin cocok untuk Anda: unix.stackexchange.com/a/109270/111707 Tulis skrip Python kecil yang Anda luncurkan .bashrcsaat login, lalu dengarkan sinyal logout Gnome dan matikan sendiri.
IanB
@IanB Terima kasih, saya akan mengujinya. Tidak ada salahnya memiliki sesuatu seperti itu di sekitarnya.
GeorgeKaf

Jawaban:

15

Gunakan systemd itu sudah termasuk dukungan untuk sesi pengguna, sebenarnya Anda harus sudah bergantung padanya (tanpa disadari).

Buat direktori layanan

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

Buat edit file layanan (vim, gedit, geany - apa pun yang Anda inginkan)

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

Seharusnya terlihat seperti ini, jika ini adalah layanan permanen.

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

Tapi sepertinya Anda lebih suka memicunya sekali, lalu baik-baik saja, jadi gunakan konfigurasi oneshot seperti ini:

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

Ini tentu saja mengasumsikan bahwa skrip Anda dapat dieksekusi, yaitu:

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

Jika tidak, Anda harus menambahkan path ke interpreter masing-masing:

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

Sekarang muat ulang systemd (dan login ulang untuk kepentingan pengujian)

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

Jika Anda memerlukan informasi lebih lanjut, lihat Arch-Wiki misalnya. Utas askubuntu ini memiliki berbagai ide, termasuk ide saya.

Anda dapat memperluas perilaku (jika Anda root) ke pengguna lain dengan mendefinisikan layanan secara global. Untuk melakukan ini, Anda perlu membuat file layanan di / usr / share / systemd / user / tidak dalam $ HOME / .local / share / systemd / user .

anx
sumber
1
hai, jawabannya bagus. Tapi itu hanya akan berfungsi jika layanan harus dimulai pada login pertama dan berhenti pada sesi pengguna terakhir .
Anwar
4
Anda memerlukan tanda --user saat mengaktifkan layanan. "systemctl --user enable my.service"
blushrt
0

Saya tahu ini beberapa tahun, tetapi jawaban dari anx hanya membantu saya keluar. Jadi, saya kira itu masih relevan. Juga, ini lebih dari komentar, tapi saya tidak punya hak istimewa itu jadi saya mempostingnya sebagai "jawaban". Bagaimanapun ...

Menjalankan Linux Mint 19, saya tidak bisa "mengaktifkan" layanan ketika skrip terletak di '$ HOME / .local / share / systemd / user'. Mencoba melakukannya selalu mengakibatkan kesalahan. Namun, saya bisa memulainya dengan baik dari direktori '$ HOME / .local / share / systemd / user'. Setelah memindahkan skrip ke '/ usr / share / systemd / user /', systemd memungkinkan saya untuk mengaktifkannya tanpa masalah.

notorious.dds
sumber