命令未在cron中运行(systemctl挂起)


12

我有这个cronjob set:

* * * * * /usr/bin/systemctl suspend

而且它不起作用。但是我可以在shell中运行它并且可以工作。我不明白什么是行不通的。

编辑 将错误输出重定向/tmp/error到此:

Failed to issue method call: Access denied
Failed to issue method call: Access denied

那么我的问题是:cronjobs是否以特殊用户身份运行(cron例如),这可以解释为我的用户可以运行命令,但不能运行cron自身?

附加说明:

  • 这是显示我在脚本中存在问题的最小示例(比这里提供的单个命令更有意义)

  • systemctl是的一部分systemd。我认为重新启动,关机,挂起与的非root用户一起使用systemd。无论如何,它正在我的系统上运行。

  • 最后,我用的Arch Linux和/bin/usr/sbin/sbin都是符号连接/usr/bin


1
您到底想在这里做什么?在外壳中运行该命令时会执行什么操作?
terdon

它挂起我的电脑
梯度

您是否希望每分钟都会发生?你systemctl在里面/usr/bin并且接受suspend那样吗?您正在使用什么* nix?
terdon

1
不,这是一个例子。实际上,它在脚本中会在电池电量不足时挂起。但这是我脚本中无法正常工作的部分。我试图给出一个最小的问题示例(即使这似乎没有意义)。
渐变

2
好的,因为此问题正在收集结束投票,请对其进行编辑以添加此额外信息。您的发行版很重要(systemctl suspend不适用于Debian或RedHat发行版),因此正在解释您实际上并不想做您正在显示的内容:)。另外,尝试添加2> /tmp/error或其他内容以捕获可能遇到的任何错误。最后,告诉我们哪个用户正在运行此crontab。
terdon

Answers:


6

我不能真的这样回答,但我想我可以为您指明正确的方向。我在以下网址的Arch Wiki 页面中找到了此内容systemd

polkit是电源管理所必需的。如果您在本地systemd-logind用户会话中,并且没有其他会话处于活动状态,则以下命令将在没有root特权的情况下工作。如果不是(例如,因为另一个用户登录了tty),systemd将自动要求您输入root密码。

[各种systemctl命令的列表]

systemctl暂停

这给我提出了以下可能性:

  1. 您有另一个用户登录。也许您已通过tty登录?

  2. cron使用运行命令/bin/sh默认情况下,在Arch上,它是的符号链接/bin/bash。这将意味着cron正在启动一个非交互式bash shell,然后该bash shell将检测到有另一个用户会话正在运行(您自己),因此systemctl尽管以您的用户身份运行,它也无权运行。

因此,如果您的问题是因为由于已经登录cron而不允许运行systemctl,则可以通过使用polkit来解决此问题,但是我在那里没有经验,所以我无能为力


谢谢!因为我能够在shell中执行命令,所以可以消除第一个选项。但是我将对第二种选择做更多的研究。
渐变

@Gradient您发现如何解决此问题?我在同一个问题上挣扎。
AkiRoss

您能否详细解释第二种可能性?有什么方法可以确认这确实是问题所在吗?我执行w,并uptime从脚本由cron运行。他们的输出表明只有一个用户。那么,这是否意味着还有其他问题?
Anmol Singh Jaggi'6

3

一个简单的解决方法是使用root的crontab而不是您自己的crontab。使用以下命令进行编辑:

$ sudo crontab -e

代替:

$ crontab -e

它以root身份而不是您的用户身份运行命令。
弗雷德里克·贝滕斯

这不应该是推荐的做法...使该命令对用户有效。
plitter

1

这里报价:

另一个答案很好!但这需要root cron。

如果要从非sudo cron休眠,则有2个选项:

1.使用polkit

制作一个包含以下内容的文件:

[Enable hibernate to be run via cron]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=yes 

com.0.enable-hibernation-from-cron.pkla在目录中 命名/etc/polkit-1/localauthority/50-local.d/

这里给出解释 。

2.使用visudo

这里报价 :

如果只允许用户使用关闭命令,而没有其他sudo特权,则以root用户身份,在/etc/sudoers使用visudo命令的末尾添加以下内容 。

user hostname =NOPASSWD: /usr/bin/systemctl poweroff,/usr/bin/systemctl halt,/usr/bin/systemctl reboot

user用您的用户名和hostname计算机的主机名代替。
现在,您的用户可以使用关闭sudo systemctl poweroff并重新启动sudo systemctl reboot。希望关闭系统电源的用户也可以使用sudo systemctl halt
仅当不希望提示您输入密码时,才使用NOPASSWD:标记。

就我而言,确切的行是:

anmol ALL=NOPASSWD: /bin/systemctl hibernate

(请注意,系统上的位置systemctl可能有所不同。)

之后,您可以编写sudo systemctl hibernatefron cron进行休眠。

注意:直接修改/etc/sudoers不好的;而是/etc/sudoers.d/使用命令- 创建自定义sudoers文件sudo visudo -f /etc/sudoers.d/custom


0

如果您正在使用系统crontab,那么您会忘记用户字段。尝试:

* * * * * root /usr/bin/systemctl suspend

您确定有一个用户字段吗?我以前从未见过它。无论如何,当我以用户身份在Shell中运行该命令时,该命令就会起作用。
渐变

2
@Gradient如果使用/etc/crontab,则会有一个用户字段,这是您cron -e作为普通用户创建的crontab 吗?
terdon

这是我crontab -e作为普通用户创建的crontab 。
渐变

您的普通用户帐户可能没有systemctl suspend未经sudo的运行权限。
cas 2013年

0

您需要在以下位置使用systemd配置文件 /etc/systemd/system

[Unit]
Description=Pimcore Events Processor

[Service]
WorkingDirectory=/var/www/html
ExecStart=/usr/bin/php run something
Restart=always
WatchdogSec=300 #in seconds
User=www-data
Group=www-data

[Install]
WantedBy=multi-user.target
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.