Cách khởi động dịch vụ systemd sau khi người dùng đăng nhập và dừng dịch vụ trước khi đăng xuất


10

Tôi có máy Fedora 23.

Tôi có một tập lệnh bash đồng bộ hóa thư mục / tập tin đồng bộ hóa thư mục cục bộ / nhà của tôi với một thư mục từ xa (trong một máy NAS). Tôi chạy thủ công nhưng tôi muốn tạo một dịch vụ systemd và làm cho nó linh hoạt hơn, vì những người khác sử dụng PC của tôi với thông tin người dùng của riêng họ, tôi muốn biết khi nào người dùng đăng nhập và bắt đầu dịch vụ của tôi sau đó.

Có điều gì tôi có thể làm từ tệp systemd của dịch vụ của mình không hoặc tôi sẽ phải kiểm tra điều đó từ mã của mình trong tập lệnh?

Tôi chỉ cần đảm bảo rằng tôi có quyền truy cập vào các biến môi trường (như $ USER) và chạy nó dưới dạng dịch vụ.

Nguồn tài liệu chính của tôi là liên kết này https://access.redhat.com/documentation/en-US/Red_Hat_ Entryprise_Linux / 7 / html / System_Adologists_Guide/sect-Quản lý dịch vụ


systemctl --userhoạt động trên F23 không?
dùng1686

Tôi đoán vậy, nó trả về một danh sách và một tin nhắn 76 loaded units listed.
GeorgeKaf

Đây là một cách tiếp cận khác có thể phù hợp với bạn: unix.stackexchange.com/a/109270/111707 Viết một tập lệnh Python nhỏ mà bạn khởi chạy từ .bashrckhi đăng nhập, sau đó nó nghe tín hiệu đăng xuất Gnome và tự tắt.
IanB

@IanB Cảm ơn bạn, tôi sẽ kiểm tra nó. Không bao giờ đau đớn khi có một cái gì đó như thế xung quanh.
GeorgeKaf

Câu trả lời:


15

Sử dụng systemd nó đã bao gồm hỗ trợ cho các phiên của người dùng, trên thực tế bạn nên phụ thuộc vào nó (vô tình).

Tạo thư mục dịch vụ

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

Tạo chỉnh sửa tệp dịch vụ (vim, gedit, geany - bất cứ điều gì bạn muốn)

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

Nó sẽ trông giống như thế này, nếu đó là một dịch vụ vĩnh viễn.

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

Nhưng có vẻ như bạn muốn kích hoạt nó một lần, sau đó hãy làm tốt với nó, vì vậy thay vì sử dụng cấu hình oneshot như thế này:

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

Tất nhiên, điều này giả định rằng tập lệnh của bạn có thể thực thi được, tức là:

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

Khác, bạn sẽ cần phải thêm đường dẫn đến trình thông dịch tương ứng:

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

Bây giờ tải lại systemd (và đăng nhập lại để thử nghiệm)

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

Nếu bạn cần thêm thông tin, hãy tham khảo Arch-Wiki chẳng hạn. Đây chủ đề askubuntu có những ý tưởng khác nhau, trong đó có tình cờ, mỏ.

Bạn có thể mở rộng hành vi (nếu bạn đã root) cho người dùng khác bằng cách xác định dịch vụ trên toàn cầu. Để thực hiện việc này, bạn cần tạo tệp dịch vụ trong / usr / share / systemd / user / không phải trong $ HOME / .local / share / systemd / user .


1
chào, câu trả lời là tốt Nhưng nó sẽ chỉ hoạt động nếu dịch vụ nên được bắt đầu ở lần đăng nhập đầu tiên và dừng ở phiên người dùng cuối .
Anwar

4
Bạn cần cờ --user khi kích hoạt dịch vụ. "systemctl --user enable my.service"
blushrt

0

Tôi biết điều này một vài tuổi, nhưng câu trả lời từ lo lắng chỉ giúp tôi ra ngoài. Vì vậy, tôi đoán nó vẫn còn liên quan. Ngoài ra, đây là một nhận xét nhiều hơn, nhưng tôi không có sự hiểu biết đó nên tôi đăng nó dưới dạng "câu trả lời". Bằng mọi giá...

Chạy Linux Mint 19, tôi không thể "kích hoạt" dịch vụ khi tập lệnh được đặt trong '$ HOME / .local / share / systemd / user'. Cố gắng làm như vậy luôn luôn dẫn đến một lỗi. Tuy nhiên, tôi có thể khởi động nó tốt từ thư mục '$ HOME / .local / share / systemd / user'. Sau khi chuyển tập lệnh thành '/ usr / share / systemd / user /', systemd cho phép tôi kích hoạt tập lệnh mà không gặp sự cố.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.