उपरोक्त उत्तर इसे करने के लिए मानक / "सही" तरीका है।
एक और दृष्टिकोण जो अधिक "एंड यूज़र" दृष्टिकोण से सरल है, किसी भी अनुसूचित या पृष्ठभूमि कार्य को "लॉग" फ़ाइल में अपना आउटपुट लिखना है। फ़ाइल आपके सिस्टम पर कहीं भी हो सकती है, लेकिन यदि कार्य रूट (से 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
बजाय >
इसे हर रन पर प्रतिस्थापित किया जाता। जो भी आपके एप्लिकेशन को सबसे अच्छा लगता है उसका उपयोग करें।
sleep 3m; echo Running