Kullanıcı oturum açtıktan sonra bir systemd hizmeti nasıl başlatılır ve kullanıcı oturumu kapatılmadan önce nasıl durdurulur


10

Bir Fedora 23 Makinem var.

Yerel / ev dizinimi (NAS makinesinde) uzak bir dizine eşitleyen bir dizin / dosya eşitleme bash komut dosyası var. Manuel olarak çalıştırıyorum, ancak bir systemd hizmeti oluşturmak ve daha esnek hale getirmek istiyorum, çünkü diğer insanlar bilgisayarımı kendi kullanıcı kimlik bilgileriyle kullandığından, bir kullanıcının ne zaman giriş yaptığını ve daha sonra hizmetimi başlattığını bilmek istiyorum.

Hizmetimin systemd dosyasından yapabileceğim bir şey var mı yoksa bunu koddaki kodumdan kontrol etmem gerekecek mi?

Sadece ortam değişkenleri ($ USER gibi) erişim var emin olmak ve bir hizmet olarak çalıştırmak gerekir.

Ana dokümantasyon kaynağım bu bağlantı 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 --userF23 üzerinde çalışıyor mu ?
user1686

Sanırım öyle, Bir liste ve bir mesaj döndürür 76 loaded units listed.
GeorgeKaf

İşte sizin için işe yarayabilecek başka bir yaklaşım: unix.stackexchange.com/a/109270/111707 Girişte başlattığınız küçük bir Python betiği yazın .bashrc, ardından Gnome oturum kapatma sinyalini dinler ve kendini kapatır.
IanB

@IanB Teşekkür ederim, test edeceğim. Etrafında böyle bir şeye sahip olmak asla acıtmaz.
GeorgeKaf

Yanıtlar:


15

Kullanıcı oturumları için zaten destek içeren systemd'yi kullanın , aslında buna zaten (istemeden) bağımlı olmalısınız.

Hizmet dizini oluşturun

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

Bir servis dosyasını düzenleyin (vim, gedit, geany - ne istersen)

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

Kalıcı bir hizmetse kabaca böyle görünmelidir.

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

Ama bir kez tetiklemeyi tercih edersiniz, sonra iyi olun, bu yüzden böyle bir yapılandırma kullanın:

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

Bu elbette betiğinizin çalıştırılabilir olduğunu varsayar, yani:

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

Aksi takdirde ilgili tercümana giden yolu eklemeniz gerekir:

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

Şimdi systemd'i yeniden yükleyin (ve test etmek için tekrar giriş yapın)

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

Daha fazla bilgiye ihtiyacınız varsa , örneğin Arch-Wiki'ye bakın. Bu askubuntu iplik, tesadüfen benim de dahil olmak üzere çeşitli fikirlere sahiptir.

Hizmeti global olarak tanımlayarak (root iseniz) davranışı diğer kullanıcılara genişletebilirsiniz. Bunu yapabilmek için / usr / share / systemd / user / değil $ HOME / .local / share / systemd / user içinde servis dosyası oluşturmanız gerekir .


1
merhaba, cevap iyiydi. Ancak, yalnızca hizmet ilk oturum açmada başlatılmalı ve son kullanıcı oturumunda durdurulmalıdırsa çalışır .
Anwar

4
Hizmeti etkinleştirirken --user bayrağına ihtiyacınız vardır. "systemctl --user enable my.service"
allık

0

Bunu birkaç yaşında biliyorum, ama kaygının cevabı bana yardımcı oldu. Yani, sanırım hala geçerli. Ayrıca, bu bir yorum daha, ama ben bu hak var bu yüzden bir "cevap" olarak gönderme. Herhangi bir oranda...

Linux Mint 19 çalıştırıldığında, komut dosyası '$ HOME / .local / share / systemd / user' konumundayken hizmeti "etkinleştiremedim". Bunu yapmaya çalışmak her zaman bir hatayla sonuçlandı. Ancak, '$ HOME / .local / share / systemd / user' dizininden gayet iyi başlayabilirim. Komut dosyasını '/ usr / share / systemd / user /' klasörüne taşıdıktan sonra, systemd sorunsuz olarak etkinleştirmeme izin verdi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.