我刚从Ubuntu服务器14升级到版本15。升级后,我的新贵脚本无法正常工作,并且读到systemd是新的默认值。我距离Linux专家还很远,所以请对我放轻松:-)

这是我的暴发户脚本之前的内容:

description "NZBGet upstart script"

setuid robert
setgid robert

start on runlevel [2345]
stop on runlevel [016]

respawn

expect fork

script
    exec nzbget -D
end script

pre-stop script
    exec nzbget -Q
end script


基于系统化wiki页面的新贵,我使用那里提供的表来尽可能紧密地映射新的系统化服务文件中的内容:

[Unit]
Description=NZBGet Service

[Service]
Type=forking
ExecStart=/usr/local/bin/nzbget -D
ExecStop=/usr/local/bin/nzbget -Q
Restart=on-failure


文件位于/home/robert/.config/systemd/user/nzbget.service。要手动启动该服务,我一直在做:

$ systemctl --user start nzbget


这很好用。但是,当我退出SSH会话时,该服务将关闭。此外,它不会在启动或用户登录时启动。我希望它的行为与作为新贵服务时的行为相同:我希望它在启动时启动,不断运行并以特定用户身份运行。

我需要做些什么才能获得此配置?

#1 楼

第一个问题

您可以在单元文件的User=部分中指定指令Group=[Service]

第二个问题

使服务运行在启动时,您不应将其放在主文件夹中。而是将其放在/etc/systemd/system/下。这是系统管理员(即您)用来添加新的系统范围服务的文件夹。

其他文件夹包括:



/usr/lib/systemd/system/适用于要安装单元文件的软件包,尽管在Debian和Ubuntu下该文件夹实际上是/lib/systemd/system/,因为各种binlib文件夹尚未合并到统一的/usr/前缀中。

/usr/local/systemd/system/用于通过本地编译的软件包安装单元。

测试单元

一旦单元文件位于适当的位置,您可以尝试通过键入systemctl start <UNIT_FILENAME>立即尝试启动单元通常。它无需输入设备的完整路径即可工作。如果扩展名为.service,也不必指定扩展名。

启用设备

在启用设备之前,需要添加一个[Install]部分,在此之下您应该添加指令WantedBy=multi-user.target。此伪指令指定启动过程的阶段,在该阶段应启动服务(如果已启用)。 multi-user.target适用于大多数服务。

一旦添加了信息,就可以使用systemctl enable <UNIT_FILENAME>,它启用了该单元,使systemd从现在开始在指定阶段启动时自动启动。 >

评论


安装警告实际上非常重要。如果没有[Install]部分下的WantedBy = multi-user.target,它将无法在启动时启动。将其添加到.service文件后,即可启用它。

–void.pointer
2015年10月11日,下午2:37

对于这么长的时间无人问津,我深表歉意。我修复了单元文件应存放的位置,并添加了有关[安装]部分的缺失信息。希望它现在对任何寻找它的人都有帮助。

–山毛
16-2-18在19:50



当使用用户名进行模板化时,这变得容易得多,即使用文件名定义您的服务,格式为something @ .service,然后启用诸如something@username.service之类的设置,该设置变为User =%i,表示该用户未进行硬编码且为多个用户可以使用相同的定义。一个例子。

–沃尔夫
17年5月6日在12:38



如果将它放在/ etc / systemd / user /下,它会启动吗?

–Khurshid Alam
17年4月4日在13:50

您的单位文件位于/ usr / local / lib / systemd / system中,并且您运行systemctl enable [service],将它们链接到/ etc / systemd / system中。您不应该将文件放在/ etc / systemd / system中。请参阅:man systemd并在目录下查找

–fbicknel
19/12/17在13:11

#2 楼

您可能对使用systemd的用户留存功能感兴趣。它是通过loginctl enable-linger USERNAME启用的。

会在启动时为相应用户启动一个单独的服务管理器,因此,根据启动和关闭时的时间,将在~/.config/systemd/user中对用户定义的单元进行拾取和处理。您的服务配置。

还可以使用systemctl --user来管理和配置服务,这些服务将在用户的服务管理器(而不是系统之一)上运行。

评论


systemctl --user是一个了不起的发现。谢谢!

–安瓦尔
17年5月14日下午4:35

@byteborg也许您可以为unix.stackexchange.com/questions/409900/做贡献?我需要在用户延迟服务中依赖PostgreSQL,但是数据库仍然是系统服务,而不是用户的服务。

–MichałF
17年12月15日在9:10



服务运行后,是否有任何技术可以使用户查看服务日志?没有特权的用户将无法访问/ var / log / syslog。

–mpr
18年3月16日在17:27

请注意,systemctl --user似乎不适用于SSH会话。

– Mark K Cowan
18年4月16日在12:06

@MarkKCowan可以,您只需要确保可以运行它即可。在某些情况下,您可能会收到错误systemd [29239]:PAM无法进行dlopen(pam_systemd.so):/lib/security/pam_systemd.so:无法打开共享对象文件:无此类文件或目录,并且PAM添加了错误的模块:pam_systemd .so,在执行systemctl时,在这种情况下启动user@$USER.service只需安装libpam-systemd,您就可以正常工作并在启动时启动

–特雷维尼奥
18年6月17日在9:40