comando não executando no cron (systemctl suspend)

12

Eu tenho este cronjob definido:

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

E não está funcionando. Mas eu posso executá-lo em um shell e funciona. Não entendo o que poderia não estar funcionando.

Edição Redirecionando a saída de erro para /tmp/error:

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

Minha pergunta é: Os cronjobs são executados como um usuário especial ( cronpor exemplo), o que explicaria que meu usuário pode executar o comando, mas não cronele próprio?

Explicação adicional:

  • Este é um exemplo mínimo para mostrar um problema que tenho em um script (que faz mais sentido do que o único comando fornecido aqui)

  • systemctlfaz parte de systemd. Eu acho que reiniciar, desligar, suspender estão trabalhando com um usuário não root systemd. De qualquer forma, está funcionando no meu sistema.

  • Finalmente, eu uso o Arch Linux e /bin, /usr/sbin, /sbinsão todos links simbólicos para /usr/bin.

Gradiente
fonte
1
O que exatamente você está tentando fazer aqui? O que o comando faz quando você o executa no shell?
terdon
Ele suspende o meu computador
Gradient
E você quer que isso aconteça a cada minuto? Seusystemctl está dentro /usr/bine aceita suspendassim? O que * nix você está usando?
terdon
1
Não, é um exemplo. Na verdade, ele está em um script que é suspenso quando a bateria está fraca. Mas esta é a parte do meu script que não está funcionando. Tentei dar um exemplo mínimo do problema (mesmo que isso pareça não fazer sentido).
Gradiente
2
OK, uma vez que esta pergunta está recebendo votos aproximados, edite -a para adicionar essas informações extras. Sua distribuição é importante ( systemctl suspendnão funciona nas distribuições Debian ou RedHat) e está explicando que você realmente não quer fazer o que está mostrando :). Além disso, tente adicionar 2> /tmp/erroralgo para capturar os erros que você possa estar recebendo. Por fim, diga-nos qual usuário está executando este crontab.
terdon

Respostas:

6

Eu realmente não posso responder como tal, mas acho que posso apontar você na direção certa. Encontrei isso na página do Arch Wiki de systemd:

O polkit é necessário para o gerenciamento de energia. Se você estiver em uma sessão local do usuário systemd-logind e nenhuma outra sessão estiver ativa, os seguintes comandos funcionarão sem privilégios de root. Caso contrário (por exemplo, porque outro usuário está logado em um tty), o systemd solicitará automaticamente a senha root.

[lista de vários comandos systemctl]

suspensão do systemctl

Isso me sugere as seguintes possibilidades:

  1. Você tem outro usuário conectado. Talvez você tenha feito login através de um tty?

  2. cronexecuta seus comandos usando /bin/sh. Por padrão , no Arch, este é um link simbólico para/bin/bash . Isso significa que cronestá iniciando um shell bash não interativo que, em seguida, detecta que há outra sessão de usuário em execução (sua), para que ele não tenha o direito de executar systemctlapesar de executar como usuário.

Portanto, se o seu problema é porque cronnão é permitido executar systemctlporque você já está logado, você pode contornar isso jogando com o polkit, mas eu não tenho experiência lá, então não posso ajudar.

terdon
fonte
Obrigado! A primeira opção pode ser eliminada, pois eu sou capaz de executar o comando em um shell. Mas vou fazer mais algumas pesquisas sobre a segunda opção.
Gradiente
@Gradient você descobriu como consertar isso? Estou lutando com o mesmo problema.
AkiRoss
Poderia explicar a segunda possibilidade com mais detalhes? Existe alguma maneira de confirmar que esse é realmente o problema? Eu executei we a uptimepartir dos scripts executados pelo cron. Suas saídas indicavam que havia apenas um usuário. Então, isso significa que há algum outro problema?
Anmol Singh Jaggi
3

Uma solução fácil é usar o crontab do root em vez do seu. Edite-o com:

$ sudo crontab -e

ao invés de:

$ crontab -e
Frederik Baetens
fonte
Ele executa os comandos como root e não como usuário.
Frederik Baetens
Essa não deve ser uma prática recomendada ... faça o comando funcionar para o usuário.
plitter
1

Citando aqui :

A outra resposta é ótima! Mas isso requer cron cron.

Se você deseja hibernar a partir de cron não-sudo, existem 2 opções:

1. Usando o polkit

Faça um arquivo contendo o seguinte:

[Enable hibernate to be run via cron]
Identity=unix-user:*
Action=org.freedesktop.login1.hibernate;org.freedesktop.login1.hibernate-multiple-sessions
ResultAny=yes 

nomeado com.0.enable-hibernation-from-cron.pklano diretório /etc/polkit-1/localauthority/50-local.d/.

A explicação é dada aqui .

2. Usando visudo

Citando aqui :

Se os usuários puderem usar apenas comandos de desligamento, mas não tiverem outros privilégios de sudo, como root, adicione o seguinte ao final do /etc/sudoersuso do visudocomando.

user hostname =NOPASSWD: /usr/bin/systemctl poweroff,/usr/bin/systemctl halt,/usr/bin/systemctl reboot

Substitua userpelo seu nome de usuário e hostnamepelo nome do host da máquina.
Agora seu usuário pode desligar sudo systemctl poweroffe reiniciar com sudo systemctl reboot. Usuários que desejam desligar um sistema também podem usar sudo systemctl halt.
Use a tag NOPASSWD: somente se você não desejar que sua senha seja solicitada.

No meu caso, a linha exata é:

anmol ALL=NOPASSWD: /bin/systemctl hibernate

(Observe que o local systemctlpode ser diferente no seu sistema.)

Depois disso, você pode escrever sudo systemctl hibernate fron cron para hibernar.

Nota: Modificar diretamente /etc/sudoersé ruim ; em vez disso, crie um arquivo de sudoers customizado /etc/sudoers.d/usando o comando - sudo visudo -f /etc/sudoers.d/custom.

Anmol Singh Jaggi
fonte
0

Se você estiver usando o crontab do sistema, esquecerá o campo do usuário. Experimentar:

* * * * * root /usr/bin/systemctl suspend
Martin von Wittich
fonte
Tem certeza de que existe um campo de usuário? Eu nunca vi um cronjob com ele antes. De qualquer forma, o comando funciona quando eu o executo como usuário em um shell.
Gradiente
2
@Gradient: existe um campo de usuário, se você estiver usando /etc/crontab, esse é um crontab que você criou cron -ecomo seu usuário normal?
terdon
É um crontab que eu criei crontab -ecomo usuário normal.
Gradiente
sua conta de usuário normal provavelmente não tem permissão para executar systemctl suspendsem o sudo.
cas
0

Você precisa usar o arquivo de configuração 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
James M
fonte