यह 'at' कमांड मानक आउटपुट पर प्रिंट क्यों नहीं करता है?


15

मैं एक रिश्तेदार लिनक्स नौसिखिया हूँ। मैं यह सीखने का प्रयास कर रहा हूं कि कैसे उपयोग किया atजाए ताकि मैं बाद के समय पर काम शुरू कर सकूं, बिना उपयोग किए sleep। मैं मदद के लिए इस पिछले सवाल को देख रहा हूं ।

मेरा प्रश्न यह है कि मैंने जो नमूना सैंपल बैश स्क्रिप्ट बनाया है, उसमें "रनिंग" क्यों नहीं है - जहां तक ​​मैं बता सकता हूं - मानक आउटपुट (यानी, मेरा बैश कंसोल) पर मुद्रित है?

#!/bin/bash

echo "Started"

at now + 1 minutes <<EOF
echo "Running"
EOF

echo "Finished"

उदाहरण के लिए मैं केवल एक ही आउटपुट देख रहा हूं:

Started
warning: commands will be executed using /bin/sh
job 3 at Fri Jul 12 17:31:00 2013
Finished

क्या मेरे सवाल का जवाब चेतावनी में मिला है? यदि हां, तो /bin/shमानक आउटपुट से अलग कैसे होता है ?


इसे sleep 3m; echo Running
आज़माइए

जवाबों:


18

क्योंकि atउपयोगकर्ता सत्र में आपके लॉग के संदर्भ में कमांड निष्पादित नहीं करता है। विचार यह है कि आप एक मनमाने समय पर चलाने के लिए एक कमांड शेड्यूल कर सकते हैं, फिर लॉग आउट कर सकते हैं और सिस्टम निर्दिष्ट समय पर कमांड चलाने का ध्यान रखेगा।

ध्यान दें कि at(1)विशेष रूप से कहता है कि मैनुअल पेज (मेरा जोर):

उपयोगकर्ता को अपने कमांड से मानक त्रुटि और मानक आउटपुट मेल किया जाएगा , यदि कोई हो। मेल कमांड / usr / sbin / sendmail का उपयोग करके भेजा जाएगा।

तो आपको अपने स्थानीय मेल स्पूल की जाँच करनी चाहिए या, यह विफल करते हुए, स्थानीय सिस्टम मेल लॉग करता है। / var / स्पूल / मेल / $ USER शायद शुरू करने के लिए एक अच्छी जगह है।

यह भी ध्यान दें कि "प्रारंभ" और "समाप्त" की शुरुआत बाहरी लिपि से होती है और स्वयं का इससे कोई लेना-देना नहीं है at। आप उन्हें या atमंगलाचरण निकाल सकते हैं और आपको अनिवार्य रूप से एक ही परिणाम मिलेगा।


8

जैसा कि @ माइकलकॉर्जलिंग ने इसे समझाया है कि आपकी atनौकरी से उत्पन्न होने वाले किसी भी आउटपुट को पकड़ लिया जाएगा और आपको ईमेल के माध्यम से भेजा जाएगा। यदि आपके पास अपने बॉक्स पर एक एमटीए - मेल ट्रांसफर एजेंट नहीं है, तो ईमेल सीमित हो सकता है और आपको पता नहीं चलेगा कि atऐसा करने का प्रयास भी नहीं किया गया है।

एक एमटीए, एक कार्यक्रम के रूप में है sendmailया postfixकि एक उचित गंतव्य के लिए ईमेल "देने" कर सकते हैं। इस मामले में यह /var/spool/mailआपके स्थानीय सिस्टम पर एक मेल कतार (निर्देशिका के तहत एक फ़ाइल ) को वितरित करने जा रहा है। सिस्टम का प्रत्येक उपयोगकर्ता इस निर्देशिका में एक कतार रख सकता है।

मेरे फेडोरा सिस्टम पर अगर मैं शुरू करता हूं sendmailतो लोकल मेल डिलीवरी हो सकती है। मैं आमतौर पर यह बंद है, हालांकि।

$ sudo service start sendmail

अब हम देख सकते हैं कि मेरे उपयोगकर्ता खाते के लिए मेरी मेल कतार samlखाली है:

$ ll /var/spool/mail/|grep saml
-rw-rw----. 1 saml mail       0 Jul 12 19:33 saml

तो अब हम atकाम चलाते हैं :

$ at now + 1 minutes <<EOF
echo "Running"
EOF
job 96 at Fri Jul 12 19:38:00 2013

हम देख सकते हैं कि नौकरी के साथ चलने का इंतजार है atq:

$ atq
96  Fri Jul 12 19:38:00 2013 a saml

कुछ मिनटों के बाद इसे फिर से चलाने पर हम देख सकते हैं कि atकाम पूरा हो गया है:

$ atq
$

संयोग से, मेरे एमटीए के चलने के साथ अब मुझे यह संदेश अपने टर्मिनल में मिलेगा:

आपके पास / var / स्पूल / मेल / saml में नया मेल है

तो चलिए देखते हैं:

$ ll /var/spool/mail/|grep saml
-rw-rw----. 1 saml mail     651 Jul 12 19:38 saml

हाँ, हमें मेल मिला है, तो चलिए इसका उपयोग करके देखते हैं mutt:

$ mutt -f /var/spool/mail/saml

हमारी मेल कतार के "इनबॉक्स" में यह है:

     mutt के इनबॉक्स के ss

आइए इस ईमेल को देखें:

     ss of mutt का msg

और इसने काम किया।


@ MichaelKjörling - मठ rulz 8-)
SLM

5

मैं डेबियन 8.1 (jessie) चला रहा हूं,
आप 'at' आउटपुट को tty का उपयोग करके किसी टर्मिनल पर जा सकते हैं।

$ tty
/dev/pts/1

$ at now + 1 min
warning: commands will be executed using /bin/sh
at> echo 'ZZZZZ' > /dev/pts/1
at> <EOT>

एक मिनट बाद, और 'ZZZZZ' आपके टर्मिनल में दिखाई देगा ...


2

उपरोक्त उत्तर इसे करने के लिए मानक / "सही" तरीका है।

एक और दृष्टिकोण जो अधिक "एंड यूज़र" दृष्टिकोण से सरल है, किसी भी अनुसूचित या पृष्ठभूमि कार्य को "लॉग" फ़ाइल में अपना आउटपुट लिखना है। फ़ाइल आपके सिस्टम पर कहीं भी हो सकती है, लेकिन यदि कार्य रूट (से cron, आदि) के रूप में चल रहा है , तो कहीं न कहीं /var/logइसे लगाने के लिए एक अच्छी जगह है।

मैंने /var/log/maintनिर्देशिका बनाई और इसे हर किसी के द्वारा पठनीय बनाया गया और मेरे पास "बैकअप" नामक एक पठनीय फ़ाइल है जहाँ मैं अपनी बैकअप स्क्रिप्ट से आउटपुट लॉग करता हूँ।

मैंने अपनी खुद की निर्देशिका बनाई ताकि मेरी फाइलें सिस्टम द्वारा उत्पन्न चीजों के साथ मिश्रित न हों।

वहां सामान रखने के लिए (बैश में):

BACKUP="/var/log/maint/backup"
echo "my message" >> "${BACKUP}"

>>का कारण बनता है संदेशों के बजाय हर बार अधिलेखन की फ़ाइल में जोड़ा जाता है।

यदि मेरी स्क्रिप्ट में बहुत अधिक आउटपुट हैं, तो मैं आउटपुट के लिए स्क्रिप्ट या फ़ंक्शन का उपयोग करता हूं ताकि सब कुछ समान हो जाए। नीचे मेरा वर्तमान (ओवरकिल संस्करण) है: (VERBOSE सामान तब है जब मैं एक टर्मिनल से स्क्रिप्ट चला रहा हूं और देखना चाहता हूं कि डिबगिंग उद्देश्यों के लिए क्या हो रहा है।)

#!/bin/bash
## backup_logger
## backup system logging module
## Copyleft 01/20/2013 JPmicrosystems
## Usage is ${SCRIPT_NAME} [-v] [<caller> <log message text>]
## If present, -v says log to console as well as to the log file
## <caller> is the name of the calling script
## If <caller> <log message text> is not present, write a blank line to the log

## Must be placed in path, like ~/bin
## If log is owned by root or another user, then this must run as root ...
## If not, it just aborts

##source "/home/bigbird/bin/bash_trace"  ## debug
SCRIPT_NAME="$(basename $0)"
USAGE="Usage is ${SCRIPT_NAME} [-v] [<caller> <log message text>]"
SYSLOGDIR='/var/log/maint'
SYSLOGFILE="${SYSLOGDIR}/backup.log"

LOGGING=1
VERBOSE=0
if [ "${1}" == "-v" ]
then
  VERBOSE=1
  shift
fi

##LOGGING=0  ## debug
##VERBOSE=1  ## debug

## Only zero or two parameters allowed - <caller> <log message text>
RC=0
if [ "$#" -eq 1 ] || [ "$#" -gt 2 ]
then
  echo "${USAGE}"
  RC=1
else
  if [ ! -w "${SYSLOGFILE}" ]
  then
    touch "${SYSLOGFILE}"
    if [ $? -ne 0 ]
    then
      echo -e "$(date) ${1} ${2}"
      echo "${SCRIPT_NAME} Can't write to log file [${SYSLOGFILE}]"
      RC=1
      exit ${RC}
    fi
  fi

  if [ -n "${1}" ]
  then
    (( LOGGING )) && echo -e "$(date) ${1} ${2}"  >> "${SYSLOGFILE}"
    (( VERBOSE )) && echo -e "$(date) ${1} ${2}"
  else
    (( LOGGING )) && echo "" >> "${SYSLOGFILE}"
    (( VERBOSE )) && echo ""
  fi
fi

exit $RC

संपादित करें: सरलीकृत atउदाहरण जो उपयोगकर्ता फ़ाइल में लिखता है

हमेशा के लिए इसका इस्तेमाल नहीं किया, इसलिए मैंने इसे सरल स्क्रिप्ट के एक जोड़े के साथ खोजा।

पहली स्क्रिप्ट सिर्फ घटना का उपयोग करके शेड्यूल करती है at। कमांड को केवल एक टर्मिनल में टाइप किया जा सकता है, लेकिन मैं आलसी हूं - खासकर जब मुझे इसे कमांड इतिहास के साथ बेवकूफ बनाए बिना परीक्षण करते हुए कई बार करना पड़ता है।

#!/bin/bash
## mytest_at_run
## Schedule a script to run in the immediate future
echo "/home/bigbird/bin/mytest_at_script" | at 00:56

दूसरी स्क्रिप्ट वह है जिसे चलाना है

#!/bin/bash
## mytest_at_script
## The script to be run later
echo "$(date) - is when this ran" >> /home/bigbird/log/at.log

मैंने एक टेक्स्ट एडिटर में दोनों स्क्रिप्ट्स बनाईं, उन्हें सहेजा और फिर उन्हें प्रत्येक निष्पादन योग्य का उपयोग करके बनाया chmod 700 script-file-name। मैंने उन दोनों को अपनी $HOME/binनिर्देशिका में सुविधा के लिए रखा , लेकिन वे कहीं भी हो सकते थे, जहां मेरे उपयोगकर्ता की पूरी पहुंच थी। मैं 700किसी भी स्क्रिप्ट के लिए उपयोग करता हूं जो सिर्फ परीक्षण के लिए है, लेकिन एक एकल उपयोगकर्ता प्रणाली पर, यह बस के रूप में अच्छी तरह से हो सकता है 755

मेरे पास पहले से ही एक निर्देशिका है जिसे /home/bigbird/logआउटपुट से बचाने के लिए बुलाया गया है mytest_at_script। यह कहीं भी हो सकता है जहां आपके उपयोगकर्ता की पूरी पहुंच हो। बस यह सुनिश्चित करें कि यह स्क्रिप्ट चलने से पहले मौजूद है या स्क्रिप्ट ने इसे बनाया है।

इसे चलाने के लिए, मैंने अभी यह सुनिश्चित किया है कि भविष्य में atकमांड का समय mytest_at_runथोड़ा सा हो और फिर इसे टर्मिनल से चलाया जाए। मैंने तब तक इंतजार किया जब तक कि यह भाग नहीं गया और सामग्री की जांच की $HOME/log/at.log

bigbird@sananda:~/bin$ cat ~/log/at.log
Fri Sep 14 00:52:18 EDT 2018 - is when this ran
Fri Sep 14 00:56:00 EDT 2018 - is when this ran
bigbird@sananda:~/bin$

कुछ नोट:

भले ही मैं atअपने उपयोगकर्ता से भाग रहा हूं , लेकिन यह मेरे पर्यावरण जैसे कि मेरी PATHऔर मेरी होम डायरेक्टरी को नहीं जानता है , इसलिए मैं ऐसा नहीं मानता। मैं किसी भी cronकाम के लिए पूरे रास्ते का उपयोग करता हूं । और अगर मैं कभी इसे cronकाम करना चाहता हूं, तो मुझे इसे चलाने के लिए कुछ भी बदलना नहीं पड़ेगा।

मैं लॉग फ़ाइल में आउटपुट को जोड़ने के लिए इस्तेमाल करता >>था जिसके mytest_at_scriptबजाय >इसे हर रन पर प्रतिस्थापित किया जाता। जो भी आपके एप्लिकेशन को सबसे अच्छा लगता है उसका उपयोग करें।


क्या आप मुझे एटी कमांड का उपयोग करके लॉग फ़ाइल में आउटपुट लिखने के लिए कोई भी उदाहरण प्रदान कर सकते हैं, मैं निम्नलिखित तरीके से कोशिश कर रहा हूं, लेकिन अब + 1 मिनट पर> इको "" हैलो "" / होम / कैमसर्कल / cams_scripts / texstestest। txt पर> <EOT>
पवन कुमार वर्मा

@PavanKumarVarma - atएक फ़ाइल में लिखने के लिए एक सरलीकृत (परीक्षण) उदाहरण जोड़ा गया । ऐसा लगता है कि आपको अपने उदाहरण में कॉलिंग सीक्वेंस पीछे की ओर मिला। मैं यह बताने में बहुत अच्छा नहीं हूं atकि नौकरी कब चलाना है, इसलिए मैंने निकट भविष्य में बहुत मुश्किल से एक बार कोड किया।
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.