如何对 systemd 模板实例进行符号链接或别名?

fie*_*edl 8 systemd

概括

如果我有一个 systemd 模板单元foo@.service,我如何符号链接到特定模板实例或为特定模板实例创建别名,例如,它bar.service是 的快捷方式foo@bar.service

背景

我有几个由 docker-compose 运行的服务。

/var/docker-compose/nginx/docker-compose.yml
/var/docker-compose/nextcloud/docker-compose.yml
/var/docker-compose/diaspora/docker-compose.yml
Run Code Online (Sandbox Code Playgroud)

为了使用 systemd 管理这些服务,我采用了一种使用模板单元的方法,以避免重复,因为所有 docker-compose 单元文件几乎都是相同的。

# /etc/systemd/system/docker-compose@.service

[Unit]
Description=%i service with docker compose
Requires=docker.service
After=docker.service

[Service]
Restart=always

WorkingDirectory=/var/docker-compose/%i

# Remove old containers, images and volumes
ExecStartPre=/usr/bin/docker-compose down -v
ExecStartPre=/usr/bin/docker-compose rm -fv
ExecStartPre=-/bin/bash -c 'docker volume ls -qf "name=%i_" | xargs docker volume rm'
ExecStartPre=-/bin/bash -c 'docker network ls -qf "name=%i_" | xargs docker network rm'
ExecStartPre=-/bin/bash -c 'docker ps -aqf "name=%i_*" | xargs docker rm'

# Compose up
ExecStart=/usr/bin/docker-compose up %i

# Compose down, remove containers and volumes
ExecStop=/usr/bin/docker-compose down -v

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

目标

现在我想为各个服务提供别名或符号链接,以使启动和停止它们的时间更短。

而不是

systemctl stop docker-compose@nginx
Run Code Online (Sandbox Code Playgroud)

我想输入:

systemctl stop nginx
Run Code Online (Sandbox Code Playgroud)

什么不起作用

  • 我尝试创建一个符号链接:

    cd /etc/systemd/system
    ln -s docker-compose@nginx.service nginx.service
    
    Run Code Online (Sandbox Code Playgroud)

    但当nginx.service我想启动或停止它时却找不到。

  • 我尝试在模板单元中定义别名:

    [Install]
    Alias=%i.service
    
    Run Code Online (Sandbox Code Playgroud)

    但是,如果我理解正确的话,这是不允许的,而且它对我不起作用。

  • 我还没有找到一种方法来“导入”或“需要”基本单元文件并仅覆盖该WorkingDirectory行。然后,我可以创建单独的短文件,如下所示:

    # /etc/systemd/system/nginx.service
    
    Import=docker-compose@.service
    
    WorkingDirectory=/var/docker-compose/nginx
    
    Run Code Online (Sandbox Code Playgroud)

谢谢!

小智 0

如何按原样接受该命令并仅使用命令行的 bash 别名:

文件~/.bash_aliases

alias nginx-stop="systemctl stop docker-compose@nginx"
alias nginx-start="systemctl start docker-compose@nginx"
alias nextcloud-stop="systemctl stop docker-compose@nextcloud"
alias nextcloud-start="systemctl start docker-compose@nextcloud"
alias diaspora-stop="systemctl stop docker-compose@diaspora"
alias diaspora-start="systemctl start docker-compose@diaspora"
Run Code Online (Sandbox Code Playgroud)