我正在寻找一种方法来拥有一个通用的 systemd 服务文件,该文件可以作为外部文件中定义的用户启动其命令。这将允许我以不同的用户身份启动不同的服务器实例,但不会有同一事物的多个版本。
我试过
[Service]
Type=forking
# Specify the level of the myserver instances on this host.
EnvironmentFile=/data/myserver/instances/LEVEL
EnvironmentFile=/data/myserver/instances/%i/USER
ExecStart=/sbin/daemonize /data/myserver/bin/start.sh %i ${LEVEL}
ExecStop=/data/myserver/bin/stop.sh %i
User=$USER
我在环境文件中有这个
USER=user1
看起来 $USER 在读取环境文件之前被评估。像下面这样的东西可以接受吗?
[Service]
Type=forking
# Specify the level of the myserver instances on this host.
EnvironmentFile=/data/myserver/instances/LEVEL
EnvironmentFile=/data/myserver/instances/%i/USER
ExecStart=/sbin/daemonize /bin/sudo -u $USER /data/myserver/bin/start.sh %i ${LEVEL}
ExecStop=/data/myserver/bin/stop.sh %i
User=root
答案1
Systemd 支持使用模板化服务单元文件的实例化服务。请参阅“服务模板”:https://www.man7.org/linux/man-pages/man5/systemd.service.5.html。
一个典型的例子是 VNC 服务模板单元文件(由 TigerVNC Server 安装)。以下是 OpenVPN 的示例:https://fedoramagazine.org/systemd-template-unit-files/
答案2
我最终得到的是
[Service]
Type=forking
# Run as user1 by default
Environment='USER=user1'
# Specify the level of the myserver instances on this host.
EnvironmentFile=/data/myserver/instances/LEVEL
# Allow the specific instance to override the level
EnvironmentFile=-/data/myserver/instances/%i/LEVEL
# Possibly override who this runs as
EnvironmentFile=-/data/myserver/instances/%i/USER
ExecStart=/sbin/daemonize -u $USER /data/myserver/bin/start.sh %i ${LEVEL}
ExecStop=/bin/su - $USER -c '/data/myserver/bin/stop.sh %i'
User=root