cron에서 실행되지 않는 명령 (systemctl suspend) 다음을 /tmp/error제공합니다. Failed to

이 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. 재부팅, 종료, 일시 중단이 루트가 아닌 사용자와 작업하고 있다고 생각 systemd합니다. 어쨌든, 그것은 내 시스템에서 작동하고 있습니다.

  • 마지막으로, 나는 아치 리눅스를 사용하고 /bin, /usr/sbin, /sbin모든 심볼릭 링크입니다 /usr/bin.



답변

나는 그렇게 대답 할 수는 없지만 올바른 방향으로 당신을 가리킬 수 있다고 생각합니다. 나는 아치 위키에서이 발견 페이지systemd:

전원 관리에는 polkit 이 필요합니다. 로컬 systemd-logind 사용자 세션에 있고 다른 세션이 활성화되어 있지 않으면 다음 명령이 루트 권한없이 작동합니다. 그렇지 않은 경우 (예를 들어, 다른 사용자가 tty에 로그인했기 때문에) systemd는 자동으로 루트 암호를 묻습니다.

[다양한 systemctl 명령 목록]

systemctl 일시 중단

이것은 나에게 다음과 같은 가능성을 제안합니다.

  1. 다른 사용자가 로그인했습니다. tty를 통해 로그인 하셨나요?

  2. cron를 사용하여 명령을 실행합니다 /bin/sh. 기본적 으로 Arch에서는 심볼릭 링크 /bin/bash입니다. 이것은 cron비 대화식 bash 셸을 시작한 다음 다른 사용자 세션이 실행되고 있음을 감지하므로 사용자로 실행 systemctl하더라도 실행할 권한이 없습니다 .

따라서 이미 로그인 cron하여 실행할 수 없기 때문에 문제가 발생 systemctl하면 polkit을 사용 하여 문제를 해결할 수는 있지만 경험이 없으므로 도움을 줄 수 없습니다.


답변

쉬운 해결 방법은 루트 대신 crontab을 사용하는 것입니다. 다음을 사용하여 편집하십시오.

$ sudo crontab -e

대신에:

$ crontab -e


답변

여기 에서 인용 :

다른 대답 은 훌륭합니다! 그러나 루트 크론이 필요합니다.

스도 이외의 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. visudo 사용

여기 에서 인용
:

사용자에게 shutdown 명령 만 사용할 수 있어야하고 다른 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.


답변

시스템 crontab을 사용하는 경우 사용자 필드를 잊어 버립니다. 시험:

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


답변

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


답변