cronで実行されていないコマンド(systemctl suspend)


12

このcronjobセットがあります:

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

そして、それは機能していません。しかし、私はそれをシェルで実行でき、動作します。何が機能しないのか理解できません。

EDIT エラー出力をリダイレクトし/tmp/errorてこれを提供します:

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

私の質問は次のとおりです:cronjobsは特別なユーザー(cronたとえば)として実行されcronますか?

追加の説明:

  • これは、スクリプトにある問題を示すための最小限の例です(ここで提供されている単一のコマンドよりも理にかなっています)

  • systemctlの一部ですsystemd。再起動、シャットダウン、サスペンドは、root以外のユーザーで動作していると思いますsystemd。とにかく、それは私のシステムで動作しています。

  • 最後に、私はアーチのLinuxを使用して/bin/usr/sbin/sbinすべてのシンボリックリンクには、/usr/bin


1
ここで何をしようとしていますか?シェルで実行すると、コマンドは何をしますか?
テルドン

それは私のコンピューターを中断します
グラデーション

そして、それを毎分発生させたいですか?あなたsystemctlは中/usr/binにいてsuspend、そのように受け入れますか?何* nixを使用していますか?
テルドン

1
いいえ、それは一例です。実際には、バッテリーの電力が低下すると一時停止するスクリプト内にあります。しかし、これはスクリプト内で機能していない部分です。私は問題の最小限の例を挙げようとしました(これが意味をなさないように思えても)。
グラデーション

2
この質問は投票を収集しているため、編集してこの追加情報を追加してください。あなたのディストリビューションは重要であり(systemctl suspendDebianやRedHatのディストリビューションでは動作しません)、あなたが実際に見せたいことをしたくないことを説明しています:)。また、2> /tmp/error何かを追加してみて、発生する可能性のあるエラーをキャプチャしてください。最後に、このcrontabを実行しているユーザーを教えてください。
テルドン

回答:


6

私はそのように本当に答えることはできませんが、私はあなたを正しい方向に向けることができると思います。私はこれをArch Wiki ページで見つけましたsystemd

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

[さまざまなsystemctlコマンドのリスト]

systemctlサスペンド

これは私に次の可能性を示唆しています:

  1. 別のユーザーがログインしています。おそらくtty経由でログインしていますか?

  2. cronを使用してコマンドを実行します/bin/shデフォルトでは、Archではこれはへのシンボリックリンク/bin/bashです。これはcron、非対話型のbashシェルを起動し、別のユーザーセッション(ユーザー)が実行されていることを検出するためsystemctl、ユーザーとして実行しているにもかかわらず実行する権利がないことを意味します。

そのため、既にログインしているためcronに実行が許可されていないために問題が発生した場合、polkitでsystemctl遊ぶことで問題を回避できるかもしれませんが、私には経験がありません。


ありがとうございました!コマンドをシェルで実行できるため、最初のオプションは削除できます。しかし、2番目のオプションについてさらに調査を行います。
グラデーション

@Gradientはこれを修正する方法を発見しましたか?私は同じ問題に苦しんでいます。
アキロス

2番目の可能性について詳しく説明してください。これが実際に問題であることを確認する方法はありますか?私は実行wし、uptimeスクリプトからのcronで実行します。彼らの出力は、ユーザーのみが存在することを示しました。だから、これは他の問題があることを意味していますか?
アンモルシンジャギ

3

簡単な回避策は、自分の代わりにルートのcrontabを使用することです。以下で編集します:

$ sudo crontab -e

の代わりに:

$ crontab -e

ユーザーではなくルートとしてコマンドを実行します。
フレデリックBaetens

これは推奨される方法ではありません...ユーザーに対してコマンドを機能させます。
スプリッター

1

ここから引用:

他の答えは素晴らしいです!ただし、ルート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/sudoersvisudoコマンドの使用の最後に次を追加します 。

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 hibernate fron cronを休止状態に。

注:直接変更/etc/sudoers悪いです。代わりに/etc/sudoers.d/、コマンド-を使用してカスタムsudoersファイルを作成しますsudo visudo -f /etc/sudoers.d/custom


0

システムcrontabを使用している場合、ユーザーフィールドを忘れます。試してください:

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

ユーザーフィールドがありますか?これまでにcronjobを見たことはありません。とにかく、コマンドをシェルでユーザーとして実行すると機能します。
グラデーション

2
@Gradientを使用している場合、ユーザーフィールドがあります。/etc/crontabこれはcron -e、通常のユーザーとして作成したcrontab ですか?
テルドン

crontab -e通常のユーザーとして作成したcrontab です。
グラデーション

通常のユーザーアカウントには、おそらくsystemctl suspendsudoなしで実行する権限がありません。
cas

0

systemd configファイルを使用する必要があります /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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.