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

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


1
여기서 정확히 무엇을하려고합니까? 쉘에서 실행할 때 명령은 무엇을합니까?
terdon

그것은 내 컴퓨터를 일시 중단
그라디언트

그리고 매분마다 그렇게 하시겠습니까? 당신의 systemctl안에 /usr/bin있고 그렇게 받아 suspend들입니까? 어떤 * nix를 사용하고 있습니까?
terdon

1
아니요, 예입니다. 실제로 배터리 전원이 부족하면 일시 중단되는 스크립트에 있습니다. 그러나 이것은 내 스크립트에서 작동하지 않는 부분입니다. 나는 문제의 최소한의 예를 제시하려고 노력했다.
그라디언트

2
좋아요,이 질문은 투표를 수집 하고 있으므로이 정보를 추가 하려면 편집 하십시오. 배포판은 중요합니다 ( systemctl suspend데비안 또는 RedHat 배포판에서는 작동하지 않음). 실제로 표시하고있는 것을하고 싶지 않다고 설명합니다. :). 또한 2> /tmp/error발생하는 오류를 캡처하기 위해 추가 하거나 무언가를 시도하십시오 . 마지막으로이 crontab을 실행중인 사용자를 알려주십시오.
terdon

답변:


6

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

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

[다양한 systemctl 명령 목록]

systemctl 일시 중단

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

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

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

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


감사합니다! 쉘에서 명령을 실행할 수 있기 때문에 첫 번째 옵션을 제거 할 수 있습니다. 그러나 두 번째 옵션에 대해 더 많은 연구를 할 것입니다.
그라디언트

@Gradient이 문제를 해결하는 방법을 찾았습니까? 나는 같은 문제로 고심하고 있습니다.
AkiRoss

두 번째 가능성을 더 자세히 설명해 주시겠습니까? 이것이 실제로 문제임을 확인하는 방법이 있습니까? 나는 실행 w하고 uptime스크립트에서 크론에 의해 실행됩니다. 그들의 결과는 사용자 만 있다는 것을 나타냅니다. 이것은 다른 문제가 있다는 것을 의미합니까?
Anmol Singh Jaggi

3

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

$ sudo crontab -e

대신에:

$ crontab -e

사용자가 아닌 루트로 명령을 실행합니다.
Frederik Baetens

권장되는 방법이 아닙니다. 사용자에게 명령이 작동하도록하십시오.
플 리터

1

여기 에서 인용 :

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

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


0

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

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

사용자 필드가 있습니까? 나는 전에 그것으로 cronjob을 본 적이 없다. 어쨌든 명령은 쉘에서 사용자로 실행할 때 작동합니다.
그라디언트

2
@Gradient을 사용하는 경우 사용자 필드가 있습니다. 일반 사용자로 /etc/crontab만든 crontab cron -e입니까?
terdon

crontab -e일반 사용자로 만든 crontab 입니다.
그라디언트

일반 사용자 계정에는 systemctl suspendsudo없이 실행할 권한이 없을 수 있습니다 .
cas

-1

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.