私はこの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が停止する
これは私に次の可能性を与えます。
他のユーザーがログインしています。たぶんtty経由でログインしているかもしれません。
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/sudoers
visudo
コマンドを使用してください。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
。