cronでコマンドが実行されない(systemctl停止)

cronでコマンドが実行されない(systemctl停止)

私はこのcronjobを設定しました。

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

しかし、うまくいきません。しかし、シェルで実行でき、動作します。私は何がうまくいかないのか理解していません。

編集する エラー出力を/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

回答することはできませんが、正しい方向を知ることはできるようです。 Arch Wikiでこれを見つけました。ページsystemd

ポルキット電源管理に必要です。ローカルのsystemd-logindユーザーセッションにあり、アクティブな他のセッションがない場合は、次のコマンドを実行するためにroot権限は必要ありません。そうでない場合(たとえば、他のユーザーがttyにログインしているため)、systemdは自動的にrootパスワードを要求します。

[各種systemctl命令一覧]

systemctlが停止する

これは私に次の可能性を与えます。

  1. 他のユーザーがログインしています。たぶんtty経由でログインしているかもしれません。

  2. cronコマンドを使用して実行します/bin/sh基本的に、これはArchのシンボリックリンクです/bin/bash。これはcron、非対話型bashシェルを起動し、他のユーザーセッションが実行中であることを検出し、ユーザーとして実行しても実行する権限がないことを意味しますsystemctl

cronしたがって、すでにログインしているため実行できない問題がある場合は、systemctlこの問題を解決してプレイしてください。ポルキットところが経験がなくてできることはありません。

答え2

簡単な回避策は、自分のものではなくルートのcrontabを使用することです。編集してください:

$ sudo crontab -e

変える:

$ crontab -e

答え3

sudoなしのより簡単な解決策があります。systemd-run:

DBUS_SESSION_BUS_ADDRESSそのユーザーの環境変数を設定/エクスポートすることが重要です。systemctl-suspend次の行を使用して名前付きスクリプトを生成します。

#!/bin/bash
# This is a workaround script to be able to use 'systemctl suspend' in user-cron
PATH=/usr/bin
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/"$(id -u "$LOGNAME")"/bus
systemd-run --user systemctl suspend

実行可能にしてから、スクリプトファイルをフォルダにコピーします/usr/local/bin

最後に、次のようにユーザーのcrontabでスクリプトを実行します。

0 22 * * * /usr/local/bin/systemctl-suspend

Debian 10(buster)でテストされました。

答え4

から引用ここ:

もう一つの答えすごい!しかし、ルートクローンが必要です。

sudoではなくcronから休止状態に切り替えるには、次の2つのオプションがあります。

1.使用ポルキット

次の内容でファイルを作成します。

[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.使用ビジュド

から引用 ここ:

ユーザーにshutdownコマンドのみを使用でき、他のsudo権限は許可されていない場合は、rootとして次を最後に追加します。 /etc/sudoersvisudoコマンドを使用してください。

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

userユーザー名とhostnameコンピュータのホスト名を置き換えます。
これで、ユーザーはshutdownを使用してsudo systemctl poweroffからrestartを使用できるようになりますsudo systemctl reboot。また、システムの電源を切るユーザーも使用できますsudo systemctl halt
パスワードを求めるプロンプトを表示したくない場合にのみ、NOPASSWD:フラグを使用してください。

私の場合、正確な行は次のとおりです。

anmol ALL=NOPASSWD: /bin/systemctl hibernate

(システムによって位置がsystemctl異なる場合があります。)

sudo systemctl hibernateその後、休止状態に切り替えるためにcronを作成できます。

注:直接編集/etc/sudoersはい 悪い;の代わりに、カスタムsudoersファイルを作成します。/etc/sudoers.d/- コマンドを使用してくださいsudo visudo -f /etc/sudoers.d/custom

関連情報