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. 나는 재시작, 종료, 정지가 루트가 아닌 사용자와 작업하고 있다고 생각합니다 systemd. 어쨌든 내 시스템에서는 작동합니다.

  • 마지막으로 저는 Arch Linux를 사용하고 있으며, /bin, /usr/sbin/sbin는 모두 에 대한 심볼릭 링크입니다 /usr/bin.

답변1

답변을 드릴 수는 없지만 올바른 방향을 알려드릴 수는 있을 것 같습니다. Arch Wiki에서 이것을 찾았습니다.페이지systemd:

폴킷전원 관리에 필요합니다. 로컬 systemd-logind 사용자 세션에 있고 활성 상태인 다른 세션이 없는 경우 다음 명령을 실행하는 데 루트 권한이 필요하지 않습니다. 그렇지 않은 경우(예를 들어 다른 사용자가 tty에 로그인했기 때문에) systemd는 자동으로 루트 비밀번호를 묻습니다.

[다양한 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에서 최대 절전 모드로 전환하려면 다음 두 가지 옵션이 있습니다.

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 권한은 허용되지 않는 경우 루트로 다음을 끝에 추가하십시오. /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.

관련 정보