วิธีเริ่มบริการ systemd หลังจากผู้ใช้เข้าสู่ระบบและหยุดก่อนที่ผู้ใช้ออกจากระบบ


10

ฉันมี Fedora 23 Machine

ฉันมีไดเร็กทอรี / ไฟล์ที่ซิงโครไนซ์สคริปต์ bash ที่ซิงโครไนซ์ไดเรกทอรีโลคัล / โฮมของฉันกับรีโมตไดเร็กทอรี (ในเครื่อง NAS) ฉันเรียกใช้ด้วยตนเอง แต่ฉันต้องการสร้างบริการ systemd และทำให้มีความยืดหยุ่นมากขึ้นเนื่องจากคนอื่น ๆ ใช้พีซีของฉันด้วยข้อมูลประจำตัวผู้ใช้ของตัวเองฉันต้องการทราบว่าเมื่อผู้ใช้เข้าสู่ระบบและเริ่มบริการของฉันหลังจากนั้น

มีสิ่งที่ฉันสามารถทำได้จากไฟล์ systemd ของบริการของฉันหรือฉันจะต้องตรวจสอบว่าจากรหัสของฉันในสคริปต์หรือไม่

ฉันแค่ต้องแน่ใจว่าฉันสามารถเข้าถึงตัวแปรสภาพแวดล้อม (เช่น $ 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?
user1686

76 loaded units listedผมคิดว่าเป็นเช่นนั้นก็จะส่งกลับรายการและข้อความที่
GeorgeKaf

นี่เป็นอีกวิธีที่อาจใช้ได้ผลกับคุณ: unix.stackexchange.com/a/109270/111707เขียนสคริปต์ Python ขนาดเล็กที่คุณเรียกใช้จากการ.bashrcเข้าสู่ระบบจากนั้นจะรับฟังสัญญาณการออกจากระบบของ Gnome และปิดตัวลง
IanB

@IanB ขอบคุณฉันจะทดสอบ ไม่เคยเจ็บปวดที่จะมีอะไรแบบนั้น
GeorgeKaf

คำตอบ:


15

ใช้ systemdมันมีการรองรับเซสชันผู้ใช้อยู่แล้วซึ่งจริง ๆ แล้วคุณควรขึ้นอยู่กับมัน (โดยไม่รู้ตัว)

สร้างไดเรกทอรีบริการ

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

สร้างแก้ไขไฟล์บริการ (เป็นกลุ่ม, 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

แต่ดูเหมือนว่าคุณต้องการที่จะเรียกมันครั้งเดียวแล้วจะดีกับมันดังนั้นจึงควรใช้การตั้งค่าแบบถ่ายภาพแบบนี้:

[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 นี้มีแนวคิดที่หลากหลายรวมถึงของฉันโดยบังเอิญ

คุณสามารถขยายพฤติกรรม (หากคุณเป็นรูท) ไปยังผู้ใช้รายอื่นโดยการกำหนดบริการทั่วโลก เพื่อที่จะทำเช่นนี้คุณจะต้องสร้างไฟล์บริการใน/ usr / share / systemd / ผู้ใช้ /ไม่ได้อยู่ใน$ HOME / .local / share / systemd / ผู้ใช้


1
สวัสดีคำตอบก็ดี แต่จะใช้งานได้ก็ต่อเมื่อควรเริ่มให้บริการเมื่อลงชื่อเข้าใช้ครั้งแรกและหยุดที่เซสชันผู้ใช้ล่าสุด
Anwar

4
คุณต้องใช้แฟล็ก --user เมื่อเปิดใช้งานบริการ "systemctl --user เปิดใช้งาน my.service"
blushrt

0

ฉันรู้เรื่องนี้ไม่กี่ปี แต่คำตอบจาก anx เพิ่งช่วยฉันออก ดังนั้นฉันคิดว่ามันยังมีความเกี่ยวข้อง นอกจากนี้นี่เป็นความคิดเห็นมากกว่า แต่ฉันไม่มีสิทธิ์นั้นฉันจึงโพสต์เป็น "คำตอบ" ในอัตราใด ๆ ...

ใช้ Linux Mint 19 ฉันไม่สามารถ "เปิดใช้งาน" บริการเมื่อสคริปต์อยู่ใน '$ HOME / .local / share / systemd / user' ความพยายามที่จะทำเช่นนั้นส่งผลให้เกิดข้อผิดพลาด อย่างไรก็ตามฉันสามารถเริ่มต้นได้ดีจากไดเรกทอรี '$ HOME / .local / share / systemd / user' หลังจากย้ายสคริปต์ไปที่ '/ usr / share / systemd / user /', systemd อนุญาตให้ฉันเปิดใช้งานโดยไม่มีปัญหา

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.