komutu cron'da çalışmıyor (systemctl askıya alma)


12

Bu cronjob setim var:

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

Ve çalışmıyor. Ama onu bir kabukta çalıştırabilirim ve işe yarıyor. Neyin işe yaramayacağını anlamıyorum.

EDIT Yönlendirme hatası çıktısı aşağıdakileri /tmp/errorsağlar:

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

Benim sorum o zaman: Cronjobs özel bir kullanıcı ( cronörneğin), benim kullanıcı komutu çalıştırabilir, ancak cronkendisi açıklayabilir çalıştırmak mı?

Ek açıklama:

  • Bu, bir betikte yaşadığım bir sorunu göstermek için minimal bir örnektir (burada sağlanan tek komuttan daha mantıklıdır)

  • systemctlbir parçasıdır systemd. Bence yeniden başlatma, kapatma, askıya alma ile kök olmayan bir kullanıcı ile çalışıyoruz systemd. Her neyse, benim sistemim üzerinde çalışıyor.

  • Son olarak, Arch Linux kullanmak ve /bin, /usr/sbin, /sbintüm sembolik bağlar olurlar /usr/bin.


1
Burada tam olarak ne yapmaya çalışıyorsunuz? Komut kabuğunda çalıştırdığınızda ne yapar?
terdon

Bilgisayarımı askıya alıyor
Gradient

Ve bunun her dakika olmasını ister misin? Sizin systemctliçindedir /usr/binve onu kabul suspendböyle? Ne * nix kullanıyorsunuz?
terdon

1
Hayır, bu bir örnek. Aslında, pil gücü düşük olduğunda askıya alınan bir komut dosyasındadır. Ama bu benim senaryomda çalışmayan kısım. Sorunun minimal bir örneğini vermeye çalıştım (bu bir anlam ifade etmese bile).
Degrade

2
Tamam, bu soru yakın oy topladığından, bu fazladan bilgiyi eklemek için lütfen düzenleyin . Dağıtımınız önemlidir ( systemctl suspendDebian veya RedHat dağıtımlarında çalışmaz) ve gösterdiğiniz şeyi yapmak istemediğinizi açıklar :). Ayrıca, 2> /tmp/erroralabileceğiniz hataları yakalamak için bir şey eklemeyi deneyin . Son olarak, bize hangi kullanıcının bu crontab'ı çalıştırdığını söyleyin.
terdon

Yanıtlar:


6

Gerçekten böyle cevap veremem ama bence seni doğru yöne yönlendirebilirim. Ben Arch Wiki bunu buldum sayfanın ait systemd:

polkit güç yönetimi için gereklidir. Yerel bir systemd-logind kullanıcı oturumundaysanız ve başka bir oturum etkin değilse, aşağıdaki komutlar kök ayrıcalıkları olmadan çalışır. Değilse (örneğin, başka bir kullanıcı bir tty'ye giriş yaptığından), systemd sizden otomatik olarak kök parolayı soracaktır.

[çeşitli systemctl komutlarının listesi]

systemctl askıya alma

Bu bana şu olasılıkları gösteriyor:

  1. Giriş yapmış başka bir kullanıcı var. Belki de bir tty ile giriş yaptınız?

  2. cronkomutlarını kullanarak çalıştırır /bin/sh. Varsayılan olarak , Arch üzerinde bu bir sembolik bağlantıdır /bin/bash. Bu, cronetkileşimli olmayan bir bash kabuğunun başlatıldığı anlamına gelir ve daha sonra başka bir kullanıcı oturumunun (sizinki) çalıştığını algılar, bu nedenle systemctlkullanıcı olarak çalışmasına rağmen çalıştırma hakkına sahip değildir .

Yani, eğer probleminiz zaten giriş yapmış olduğunuz croniçin çalışmasına izin verilmiyorsa systemctl, polkit ile oynayarak bunu çözebilirsiniz, ancak orada deneyimim yok, bu yüzden yardım edemem.


Teşekkür ederim! Komutu bir kabukta yürütebildiğim için ilk seçenek elimine edilebilir. Ancak ikinci seçenek hakkında biraz daha araştırma yapacağım.
Degrade

@ Gradyan bunu nasıl çözeceğinizi keşfettiniz mi? Aynı problemle mücadele ediyorum.
AkiRoss

İkinci olasılığı daha ayrıntılı olarak açıklar mısınız? Bunun gerçekten sorun olduğunu onaylamanın bir yolu var mı? Ben yürüttüm wve uptimecron tarafından çalıştırılan senaryolardan. Çıktıları sadece kullanıcı olduğunu gösterdi. Peki, bu başka bir problem olduğu anlamına mı geliyor?
Anmol Singh Jaggi

3

Kolay bir çözüm, kök yerine kendi crontab'ını kullanmaktır. Şununla düzenle:

$ sudo crontab -e

onun yerine:

$ crontab -e

Komutları kullanıcı yerine root olarak çalıştırır.
Frederik Baetens

Bu önerilen bir uygulama olmamalıdır ... komutun kullanıcı için çalışmasını sağlayın.
plitter

1

Buradan alıntı :

Diğer cevap harika! Ancak kök cron gerektirir.

Sudo olmayan crondan hazırda bekletme modunu kullanmak istiyorsanız, 2 seçenek vardır:

1. polkit kullanma

Aşağıdakileri içeren bir dosya oluşturun:

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

adlı com.0.enable-hibernation-from-cron.pkladizinde /etc/polkit-1/localauthority/50-local.d/.

Açıklama burada verilmiştir .

2. visudo kullanma

Buradan alıntı :

Kullanıcıların yalnızca kapatma komutlarını kullanmasına izin verilmesi gerekiyorsa, ancak başka sudo ayrıcalıklarına sahip değilse, root olarak aşağıdakileri komutu /etc/sudoerskullanmanın sonuna ekleyin visudo.

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

Değiştirin useradınız ve hostnamemakinenin ana makine adı için.
Artık kullanıcınız kapanabilir sudo systemctl poweroffve yeniden başlatılabilir sudo systemctl reboot. Bir sistemi kapatmak isteyen kullanıcılar da kullanabilir sudo systemctl halt.
NOPASSWD: etiketini yalnızca şifreniz istenmezse kullanın.

Benim durumumda, kesin çizgi:

anmol ALL=NOPASSWD: /bin/systemctl hibernate

(Konumunun systemctlsisteminizde farklı olabileceğini unutmayın.)

Bundan sonra, sudo systemctl hibernatehazırda bekletmek için fron cron yazabilirsiniz .

Not: Doğrudan değişiklik /etc/sudoersyapmak kötüdür ; bunun yerine /etc/sudoers.d/- komutunu kullanarak özel bir sudoers dosyası oluşturun sudo visudo -f /etc/sudoers.d/custom.


0

Sistem crontab'ı kullanıyorsanız, kullanıcı alanını unutursunuz. Deneyin:

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

Bir kullanıcı alanı olduğundan emin misiniz? Daha önce onunla bir cronjob görmedim. Her neyse, komut bir kabukta kullanıcı olarak çalıştırdığımda çalışır.
Degrade

2
@Gradient Eğer kullanıyorsanız bir kullanıcı alanı var, /etc/crontabbu cron -enormal kullanıcı olarak oluşturduğunuz bir crontab mı ?
terdon

crontab -eNormal bir kullanıcı olarak oluşturduğum bir crontab .
Degrade

normal kullanıcı hesabınızın systemctl suspendsudo olmadan çalıştırma izni olmayabilir .
cas

-1

Sistemd yapılandırma dosyasını kullanmanız gerekir. /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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.