나는 이 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이 멈춤
이는 나에게 다음과 같은 가능성을 제시합니다.
다른 사용자가 로그인되어 있습니다. 어쩌면 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에서 최대 절전 모드로 전환하려면 다음 두 가지 옵션이 있습니다.
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/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
.