如何使 TeamViewer 服务按需而不是永远在线?

zpa*_*win 5 dpkg apt systemd services teamviewer

我使用的是 Linux Mint 19.3,并且希望让 TeamViewer systemd 服务仅在启动 GUI 应用程序 ( /opt/teamviewer/tv_bin/script/teamviewer) 时运行。在 Windows 上,通过选择 TeamViewer 并将其“启动类型”从“自动”更改为“手动”,可以从“服务”对话框中轻松完成此操作。

在 Linux 中,我有 TeamViewer 15(通过官方网站的 deb 文件安装)。我看到 systemd 服务文件有:

$ cat /etc/systemd/system/teamviewerd.service
[Unit]
Description = TeamViewer remote control daemon
After = network.target network-online.target dbus.service
Wants = network-online.target
Requires = dbus.service

[Service]
Type = forking
PIDFile = /var/run/teamviewerd.pid
ExecStart = /opt/teamviewer/tv_bin/teamviewerd -d
Restart = on-abort
StartLimitInterval = 60
StartLimitBurst = 10

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

并且该服务在登录期间自动启动,这是我不想要的。我不介意在启动 gui 之前编写一个新的 bash 脚本来启动服务,但我不太擅长编辑 systemd 服务,并且担心新版本会覆盖我的更改。

问题:

  1. 我可能可以删除服务文件并在 gui 进程启动/结束之前/之后使用 bash 包装器脚本,而不是直接启动其“ExecStart”参数。但是...如果 gui 进程使用 systemd 调用与服务进程交互,这似乎可能会很糟糕...如果我要保留 systemd 服务文件以获得更好的兼容性,有没有办法配置服务文件仍然启用该服务,但不在启动时运行,但仍然允许通过sudo systemctl [start|stop] teamviewerd?手动控制它

  2. 有没有办法为apt特定包指定安装后脚本。(例如,当aptetc 安装新版本的 teamviewer 时,可能会重新安装 systemd 服务和 *.desktop 文件,我希望它自动运行一个脚本来“修复”这些东西)。我看到了这个这个,并意识到我需要类似/etc/apt/apt.conf.d/custom-hooks脚本路径的东西,但不知道如何:a)传递最后安装的软件包列表或b)找出哪些软件包刚刚由 apt 安装。有没有比在 PRE 挂钩中捕获列表然后重新捕获并检查 POST 挂钩中的更改更优雅的方法?

  3. 还有我没有考虑过的更优雅的方法吗?

Ser*_*rgA 2

通常,已安装守护程序的启动是通过控制的systemctl [enable|disable] <service_name>。请注意,您仍然可以使用 手动启动已禁用的systemctl start <service_name>服务。

但有了Teamviewer,情况就不同了。每次更新Teamviewer/etc/systemd/system/teamviewerd.service时,它都会覆盖该文件并启用其服务启动。因此,即使您不想,守护进程也会工作。
我通过向服务添加替代来解决此问题:

systemctl stop teamviewerd.service
mkdir -p /etc/systemd/system/teamviewerd.service.d
cat >/etc/systemd/system/teamviewerd.service.d/override.conf <<EOF
[Unit]
ConditionPathExists=/tmp/allow_teamviewerd
EOF
systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

现在,要启动守护进程,请运行以下命令:

touch /tmp/allow_teamviewerd
systemctl start teamviewerd.service
rm /tmp/allow_teamviewerd
Run Code Online (Sandbox Code Playgroud)

并像往常一样停止:

systemctl stop teamviewerd.service
Run Code Online (Sandbox Code Playgroud)