如何在用户登录后启动systemd服务并在用户注销之前将其停止


9

我有一台Fedora 23机器。

我有一个目录/文件同步bash脚本,它将我的本地/主目录同步到远程目录(在NAS机器中)。我手动运行但是我想创建一个systemd服务并使其更灵活,因为其他人使用我自己的用户凭据我的PC,我想知道用户何时登录并在之后启动我的服务。

我可以从服务的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工作?
grawity 2016年

我想是这样,它返回一个列表和一条消息76 loaded units listed
GeorgeKaf 2016年

这是另一种可能适合您的方法:unix.stackexchange.com/a/109270/111707编写一个小的Python脚本,您可以.bashrc在登录时启动它,然后它会监听Gnome注销信号并自行关闭。
IanB 2017年

@IanB谢谢你,我会测试一下。拥有这样的东西永远不会伤害。
George Kaf 2017年

Answers:


12

使用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

但听起来你似乎想要触发它一次,然后好好用它,所以请使用像这样的oneshot配置:

[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用户)扩展到其他用户。为此,您需要在$ HOME / .local / share / systemd / user中的/ usr / share / systemd / user /中创建服务文件。


1
嗨,答案很好。但只有在首次登录时启动服务并在最后一个用户会话中停止时,它才会起作用。
安华

4
启用服务时需要--user标志。“systemctl --user enable my.service”
blushrt
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.