क्रॉन में कमांड नहीं चल रहा (systemctl सस्पेंड)


12

मेरे पास यह क्रोनजॉब सेट है:

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

और यह काम नहीं कर रहा है। लेकिन मैं इसे एक शेल में चला सकता हूं और यह काम करता है। मुझे समझ नहीं आ रहा है कि क्या काम नहीं किया जा सकता है।

EDIT/tmp/error इसे देने के लिए त्रुटि आउटपुट पुनर्निर्देशित करता है:

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

मेरा सवाल तो यह है: क्या क्रोनोजर एक विशेष उपयोगकर्ता ( cronउदाहरण के लिए) के रूप में चलाए जाते हैं , जो यह समझाता है कि मेरा उपयोगकर्ता कमांड चला सकता है, लेकिन cronस्वयं?

अतिरिक्त स्पष्टीकरण:

  • यह मेरे पास एक स्क्रिप्ट में एक समस्या दिखाने के लिए एक न्यूनतम उदाहरण है (जो कि यहां दिए गए एकल आदेश की तुलना में अधिक समझ में आता है)

  • systemctlका हिस्सा है systemd। मुझे लगता है कि रिबूट, शटडाउन, सस्पेंड एक गैर-रूट उपयोगकर्ता के साथ काम कर रहे हैं systemd। वैसे भी, यह मेरे सिस्टम पर काम कर रहा है।

  • अंत में, मैं आर्क लिनक्स का उपयोग करें और /bin, /usr/sbin, /sbinकरने के लिए सभी सिमलिंक हैं /usr/bin


1
वास्तव में आप यहाँ क्या करने की कोशिश कर रहे हैं? जब आप इसे शेल में चलाते हैं तो कमांड क्या करता है?
terdon

यह मेरे कंप्यूटर को निलंबित करता है
स्नातक

और क्या आप चाहते हैं कि हर मिनट ऐसा हो? आप systemctlमें है /usr/binऔर यह इस suspendतरह स्वीकार करता है? आप क्या उपयोग कर रहे हैं?
terdon

1
नहीं, यह एक उदाहरण है। यह वास्तव में एक स्क्रिप्ट में है जो बैटरी पावर कम होने पर निलंबित करता है। लेकिन यह मेरी स्क्रिप्ट का हिस्सा है जो काम नहीं कर रहा है। मैंने समस्या का एक न्यूनतम उदाहरण देने की कोशिश की (भले ही यह कोई मतलब न हो)।
स्नातक

2
ठीक है, चूंकि यह प्रश्न क्लोज़-वोट एकत्र कर रहा है, कृपया इस अतिरिक्त जानकारी को जोड़ने के लिए इसे संपादित करें । आपका डिस्ट्रो महत्वपूर्ण है ( systemctl suspendडेबियन या रेडहैट डिस्ट्रोस पर काम नहीं करता है) और इसलिए यह समझा रहा है कि आप वास्तव में वह नहीं करना चाहते जो आप दिखा रहे हैं :)। इसके अलावा, 2> /tmp/errorकिसी भी त्रुटि को पकड़ने के लिए कुछ जोड़ने या कुछ करने का प्रयास करें । अंत में, हमें बताएं कि कौन सा उपयोगकर्ता इस क्रॉन्ब को चला रहा है।
terdon

जवाबों:


6

मैं वास्तव में इस तरह का जवाब नहीं दे सकता लेकिन मुझे लगता है कि मैं आपको सही दिशा में इंगित कर सकता हूं। मुझे यह आर्क विकी पृष्ठ में मिला systemd:

बिजली प्रबंधन के लिए पोलकिट आवश्यक है। यदि आप एक स्थानीय systemd-logind उपयोगकर्ता सत्र में हैं और कोई अन्य सत्र सक्रिय नहीं है, तो निम्न आदेश रूट विशेषाधिकारों के बिना काम करेंगे। यदि नहीं (उदाहरण के लिए, क्योंकि किसी अन्य उपयोगकर्ता को टटी में लॉग किया गया है), तो systemd अपने आप आपसे रूट पासवर्ड मांगेगा।

[विभिन्न systemctl आदेशों की सूची]

systemctl सस्पेंड

यह मुझे निम्नलिखित संभावनाएं बताता है:

  1. आपके पास एक और उपयोगकर्ता लॉग इन है। शायद आपने एक tty के माध्यम से लॉग इन किया है?

  2. cronका उपयोग कर अपने आदेश चलाता है /bin/shडिफ़ॉल्ट रूप से , आर्च पर यह एक सहानुभूति है /bin/bash। इसका मतलब यह होगा कि cronएक गैर-इंटरैक्टिव बैश शेल शुरू हो रहा है जो तब पता लगाता है कि एक अन्य उपयोगकर्ता सत्र चल रहा है (आपका), इसलिए इसे systemctlआपके उपयोगकर्ता के रूप में चलाने के बावजूद चलाने का अधिकार नहीं है ।

इसलिए, यदि आपकी समस्या इसलिए cronहै systemctlक्योंकि आपको चलाने की अनुमति नहीं है क्योंकि आप पहले से ही लॉग इन हैं, तो हो सकता है कि आप पोलकिट के साथ खेलकर उस के आसपास पहुंच सकें, लेकिन मुझे वहां कोई अनुभव नहीं है इसलिए मैं मदद नहीं कर सकता।


धन्यवाद! पहला विकल्प समाप्त किया जा सकता है क्योंकि मैं एक शेल में कमांड निष्पादित करने में सक्षम हूं। लेकिन मैं दूसरे विकल्प के बारे में कुछ और शोध करूंगा।
स्नातक

@Gradient क्या आपने इसे ठीक करने की खोज की है? मैं उसी समस्या से जूझ रहा हूं।
एकिरॉस

क्या आप कृपया अधिक विस्तार से दूसरी संभावना बता सकते हैं? क्या यह पुष्टि करने का कोई तरीका है कि यह वास्तव में समस्या है? मैंने निष्पादित किया wऔर uptimeक्रोन द्वारा चलाए जाने वाले स्क्रिप्ट से। उनके आउटपुट ने संकेत दिया कि केवल उपयोगकर्ता था। तो, क्या इसका मतलब यह है कि कुछ और समस्या है?
अनमोल सिंह जग्गी

3

एक आसान तरीका यह है कि अपने खुद के बजाय रूट के कॉन्टैब का उपयोग करें। इसे संपादित करें:

$ sudo crontab -e

के बजाय:

$ crontab -e

यह आपके उपयोगकर्ता के बजाय रूट के रूप में कमांड चलाता है।
फ्रेडरिक बैटेन्स

यह एक अनुशंसित अभ्यास नहीं होना चाहिए ... उपयोगकर्ता के लिए कमांड का काम करें।
प्लिटर

1

यहाँ से उद्धृत :

अन्य उत्तर महान है! लेकिन इसके लिए रूट क्रोन की आवश्यकता होती है।

यदि आप गैर-सूडो क्रोन से हाइबरनेट करना चाहते हैं, तो 2 विकल्प हैं:

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. विडो का उपयोग करना

यहाँ से उद्धृत :

यदि उपयोगकर्ताओं को केवल शटडाउन कमांड का उपयोग करने की अनुमति दी जानी चाहिए, लेकिन अन्य sudo विशेषाधिकार नहीं हैं, तो, रूट के रूप में, कमांड का /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 hibernateहाइबरनेट करने के लिए फ्रॉन क्रोन लिख सकते हैं।

नोट: प्रत्यक्ष रूप से बदलाव /etc/sudoersहै बुरा ; इसके बजाय /etc/sudoers.d/आदेश का उपयोग कर के तहत एक कस्टम sudoers फ़ाइल बनाते हैं - sudo visudo -f /etc/sudoers.d/custom


0

यदि आप सिस्टम क्रेस्टैब का उपयोग कर रहे हैं, तो आप उपयोगकर्ता फ़ील्ड को भूल जाते हैं। प्रयत्न:

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

क्या आप सुनिश्चित हैं कि कोई उपयोगकर्ता फ़ील्ड है? मैंने पहले कभी इसके साथ क्रोनजोब नहीं देखा। वैसे भी, कमांड तब काम करता है जब मैं इसे एक शेल में एक उपयोगकर्ता के रूप में चलाता हूं।
स्नातक

2
@ यदि आप उपयोग कर रहे हैं तो एक उपयोगकर्ता फ़ील्ड है /etc/crontab, क्या यह cron -eआपके सामान्य उपयोगकर्ता के रूप में बनाया गया एक क्रेस्टैब है ?
terdon

यह crontab -eएक सामान्य उपयोगकर्ता के रूप में मेरे साथ बनाया गया एक कोंट्राब है
स्नातक

आपके सामान्य उपयोगकर्ता खाते में शायद systemctl suspendsudo के बिना चलने की अनुमति नहीं है ।
कैस

-1

आपको systemd config फाइल का उपयोग करने की आवश्यकता है /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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.