我有一个用go-rod编写的程序,它启动了一个无头铬,并连接到调试端口以执行一些与web相关的操作。使用模式相当于python中的selenium或puppeter。

当我在ssh会话中从命令行运行程序时,它会起作用。

我现在需要每晚执行这个程序。不幸的是,将其作为cron作业运行不起作用未能获取调试url:/system.slice/cron.service不是快照组.

snap提供的安全性是一件好事,我想保护它。

如何使用快照在夜间运行我的程序?

编辑:根据noisefloor的建议,我设置了一个systemd计时器来作为用户服务运行我的程序。它可以工作,即使我注销并重新启动后也是如此。这是食谱。

  1. mkdir-p~/.config/systemd/user

  2. loginectl启用程序<用户>:告诉systemd,<user>中存储了一些systemd服务和计时器~/.config/systemd/user.<user>将替换为您的帐户名。

  3. 创建服务文件~/.config/systemd/user/myservice.service包含

[单位]Description=我的服务[服务]ExecStart=<cmd args>[安装]WantedBy=多用户目标
  1. 创建名为~/.config/systemd/user/myservice.timer包含
[单位]Description=我的服务计时器[计时器]#每天早上05:00:00开始我的服务OnCalendar=*-*-*5:00:00持久=真[安装]WantedBy=计时器目标
  1. systemctl—用户启动myservice.timer

  2. 检查计时器是否正在运行:systemctl—用户列表计时器

  3. 重新启动后启用计时器systemctl—用户启用myservice.timer

这比添加crontab行要繁琐一些,但我们受益于cgroup沙箱保护。

注意:systemctl命令不必以sudo或root身份执行。

  • 请编辑您的问题,并将您添加的行添加到运行您的程序的cron中。 评论 5月24日7:02
  • @噪音地板我不是直接从cron启动铬的。我启动了一个在Go中编写的程序,该程序使用Go-rod模块及其启动chrome的启动器。如果chrome需要设置特殊的环境变量,我可以小心地进行设置。我只需要知道chrome快照需要什么。 评论 5月24日10:08
  • 很高兴看到它的工作:-)是的,这比添加crontab行要繁琐一些,但您可以更好地控制单元在何时何地执行什么操作。 评论 5月24日17:33

1个答案1

重置为默认值

由systemd启动的所有操作(包括用户会话和cron作业)都在切片单元.slice Units在后台使用名为控制组对每次使用中分配给流程/流程组的资源进行分组和分离。来自cgroup A的进程无法访问cgroup B的资源。

cron在system.slice中运行,而Chromium快照通常在user1xxx.slice(而1xxx是系统分配的用户编号)中运行,后者在user.slice内运行。因此,由cron启动的Go程序无法访问Chromium的资源,因为它们在不同的切片/cgroup中运行。

通过运行命令,可以在终端中输出切片的层次顺序和分组systemd-cgls系统.

可能的解决方案是启动Go程序通过cron,但通过systemd计时器单元它与运行Chromium快照的用户相同。这将把Go程序的执行移动到user1xxx.slice中,因此它与Chromium位于同一片中。

2
  • 非常感谢您的解释。即使用户没有打开的会话,systemd Timer Unit方法也能工作吗? 评论 5月24日13:56
  • 1
    计时器单元启动服务单元,并在服务单元内发出指令用户=用户名可用,它以命名用户的身份运行服务单元(而不是root,这是服务单元的默认值)。 评论 5月24日14:21

你必须登录来回答这个问题。

不是你想要的答案吗?浏览已标记的其他问题.