คำสั่งไม่ทำงานใน 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ตัวเองหรือไม่

คำอธิบายเพิ่มเติม:

  • นี่เป็นตัวอย่างเล็กน้อยเพื่อแสดงปัญหาที่ฉันมีในสคริปต์ (ที่เหมาะสมกว่าคำสั่งเดียวที่ให้ไว้ที่นี่)

  • systemctlsystemdเป็นส่วนหนึ่งของ ฉันคิดว่าการรีบูตการปิดการทำงานชั่วคราวกำลังทำงานกับผู้ใช้ที่ไม่ใช่รูsystemdท อย่างไรก็ตามมันทำงานบนระบบของฉัน

  • สุดท้ายผมใช้ Arch Linux และ/bin, /usr/sbin, /sbinมี symlinks /usr/binทั้งหมดเพื่อ


1
คุณพยายามทำอะไรที่นี่ คำสั่งทำอะไรเมื่อคุณเรียกใช้ในเชลล์?
terdon

มันระงับคอมพิวเตอร์ของฉัน
Gradient

และคุณต้องการที่จะเกิดขึ้นทุกนาที? คุณsystemctlอยู่ใน/usr/binและยอมรับsuspendเช่นนั้น? คุณใช้คำอะไร *
terdon

1
ไม่มันเป็นตัวอย่าง เป็นจริงในสคริปต์ที่ระงับเมื่อพลังงานแบตเตอรี่ต่ำ แต่นี่เป็นส่วนหนึ่งในสคริปต์ของฉันที่ไม่ทำงาน ฉันพยายามยกตัวอย่างปัญหาให้น้อยที่สุด (แม้ว่ามันจะไม่สมเหตุสมผลก็ตาม)
ไล่ระดับสี

2
ตกลงเนื่องจากคำถามนี้กำลังรวบรวมคะแนนโหวตอย่างใกล้ชิดโปรดแก้ไขเพื่อเพิ่มข้อมูลพิเศษนี้ distro ของคุณมีความสำคัญ ( systemctl suspendไม่ได้ทำงานกับ Debian หรือ RedHat distros) และอธิบายว่าคุณไม่ต้องการทำสิ่งที่คุณแสดง :) นอกจากนี้ลองเพิ่ม2> /tmp/errorหรือบางสิ่งบางอย่างเพื่อจับข้อผิดพลาดที่คุณอาจได้รับ สุดท้ายบอกเราว่าผู้ใช้รายใดกำลังเรียกใช้ crontab นี้
terdon

คำตอบ:


6

ฉันไม่สามารถตอบได้ แต่ฉันคิดว่าฉันสามารถชี้คุณไปในทิศทางที่ถูกต้อง ฉันพบนี้ในวิกิพีเดีย Arch หน้าของsystemd:

polkitเป็นสิ่งจำเป็นสำหรับการจัดการพลังงาน หากคุณอยู่ในเซสชันโลคัลผู้ใช้ systemd-logind และไม่มีเซสชันอื่นแอ็คทีฟคำสั่งต่อไปนี้จะทำงานโดยไม่มีสิทธิ์รูท หากไม่ใช่ (ตัวอย่างเช่นเนื่องจากผู้ใช้อื่นล็อกอินเป็น tty) systemd จะถามรหัสผ่านรูทโดยอัตโนมัติ

[รายการคำสั่ง systemctl ต่างๆ]

systemctl ระงับ

สิ่งนี้ชี้ให้ฉันเห็นถึงความเป็นไปได้ดังต่อไปนี้:

  1. คุณมีผู้ใช้อื่นเข้าสู่ระบบคุณอาจเข้าสู่ระบบผ่านทาง tty หรือไม่?

  2. cron/bin/shรันคำสั่งที่ใช้ โดยค่าเริ่มต้นบนซุ้มประตูนี้เป็น symlink /bin/bashไป นี่หมายความว่าcronเป็นการเริ่มเปลือก bash ที่ไม่มีการโต้ตอบซึ่งตรวจพบว่ามีเซสชันผู้ใช้อื่นกำลังทำงานอยู่ (ของคุณ) ดังนั้นจึงไม่มีสิทธิ์ในการเรียกใช้systemctlแม้จะทำงานในฐานะผู้ใช้ของคุณ

ดังนั้นหากปัญหาของคุณเป็นเพราะcronไม่ได้รับอนุญาตให้ทำงานsystemctlเนื่องจากคุณลงชื่อเข้าใช้แล้วคุณอาจสามารถแก้ไขปัญหานี้ได้ด้วยการเล่นกับpolkitแต่ฉันไม่มีประสบการณ์ดังนั้นฉันจึงไม่สามารถช่วยได้


ขอบคุณ! ตัวเลือกแรกสามารถกำจัดได้เนื่องจากฉันสามารถเรียกใช้คำสั่งในเชลล์ได้ แต่ฉันจะทำวิจัยเพิ่มเติมเกี่ยวกับตัวเลือกที่สอง
ไล่ระดับสีใน

@Gradient คุณค้นพบวิธีการแก้ไขปัญหานี้หรือไม่? ฉันกำลังดิ้นรนกับปัญหาเดียวกัน
AkiRoss

คุณช่วยอธิบายความเป็นไปได้ที่สองโดยละเอียดได้ไหม? มีวิธีใดที่จะยืนยันว่านี่เป็นปัญหาหรือไม่ ฉันดำเนินการwและuptimeจากสคริปต์ที่ดำเนินการโดย cron ผลลัพธ์ของพวกเขาระบุว่ามีผู้ใช้เพียงคนเดียว ดังนั้นนี่หมายความว่ามีปัญหาอื่นอีกหรือไม่?
Anmol Singh Jaggi

3

วิธีแก้ปัญหาง่ายๆคือใช้ crontab ของรูทแทนที่จะเป็นของคุณเอง แก้ไขด้วย:

$ sudo crontab -e

แทน:

$ crontab -e

มันรันคำสั่งในฐานะ root แทนที่จะเป็นผู้ใช้ของคุณ
Frederik Baetens

สิ่งนี้ไม่ควรเป็นแนวปฏิบัติที่แนะนำ ... ทำให้คำสั่งใช้ได้ผลกับผู้ใช้
plitter

1

ข้อความจากที่นี่ :

คำตอบอื่น ๆดีมาก! แต่มันต้องการราก cron

หากคุณต้องการไฮเบอร์เนตจาก non-sudo cron มี 2 ตัวเลือก:

1. การใช้polkit

ทำไฟล์ที่มีสิ่งต่อไปนี้:

[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

ข้อความจาก ที่นี่ :

หากผู้ใช้ควรได้รับอนุญาตให้ใช้คำสั่งปิด แต่ไม่ได้รับสิทธิ์ 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คือ ไม่ดี ; แทนที่จะทำให้ sudoers ไฟล์ที่กำหนดเองภายใต้การ/etc/sudoers.d/ใช้คำสั่ง sudo visudo -f /etc/sudoers.d/custom-


0

หากคุณใช้ระบบ crontab คุณจะลืมฟิลด์ผู้ใช้ ลอง:

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

คุณแน่ใจหรือว่ามีฟิลด์ผู้ใช้ ฉันไม่เคยเห็น cronjob มาก่อน อย่างไรก็ตามคำสั่งทำงานเมื่อฉันเรียกใช้เป็นผู้ใช้ในเปลือก
ไล่ระดับสีใน

2
@Gradient มีเขตข้อมูลผู้ใช้ถ้าคุณใช้/etc/crontabนี่เป็น crontab ที่คุณสร้างขึ้นด้วยcron -eในฐานะผู้ใช้ปกติของคุณหรือไม่?
terdon

มันเป็น crontab ที่ฉันสร้างขึ้นด้วยcrontab -eในฐานะผู้ใช้ปกติ
ไล่โทนสี

บัญชีผู้ใช้ปกติของคุณอาจไม่ได้รับอนุญาตให้ทำงานsystemctl suspendโดยไม่ต้องใช้sudo
cas

-1

คุณต้องใช้ไฟล์ config 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.