কেন এই '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 / সেন্ডমেল ব্যবহার করে প্রেরণ করা হবে।

সুতরাং আপনার স্থানীয় মেল স্পুলটি পরীক্ষা করা উচিত বা এটি ব্যর্থ হয়ে স্থানীয় সিস্টেমের মেল লগগুলি। / var / spool / mail / $ ব্যবহারকারী সম্ভবত শুরু করার জন্য একটি ভাল জায়গা।

এছাড়াও মনে রাখবেন যে "শুরু" এবং "সমাপ্ত" বাইরের স্ক্রিপ্ট থেকে উদ্ভূত এবং এগুলির সাথে এগুলির কোনও যোগসূত্র নেই 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 / spool / mail / 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

আমাদের মেইল ​​সারির "ইনবক্স" এ এটি রয়েছে:

     মুটের ইনবক্সের এসএস

আসুন এই ইমেলটি দেখুন:

     ss of mutt এর চিত্র

এবং এটা কাজ করে.


@ মাইকেলKjörling - mutt rulz 8-)
slm

5

আমি ডেবিয়ান 8.1 চালাচ্ছি (জেসি) টিটিটি ব্যবহার করে
আপনি 'এট' আউটপুট টার্মিনালে যেতে পারেন।

$ 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}"

>>কারণ বার্তা পরিবর্তে এটি প্রতিটি সময় মুছে ফাইলে যোগ করা হবে।

যদি আমার স্ক্রিপ্টের অনেক আউটপুট থাকে তবে আমি স্ক্রিপ্ট বা আউটপুট জন্য ফাংশন ব্যবহার করি যাতে সমস্ত কিছু একই হয়। নীচে আমার বর্তমান (ওভারকিল সংস্করণ): (আমি যখন কোনও টার্মিনাল থেকে স্ক্রিপ্টটি চালাচ্ছি এবং ডিবাগিংয়ের উদ্দেশ্যে কী চলছে তা দেখতে ভেরবস স্টাফ রয়েছে))

#!/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 মিনিটে> "" হ্যালো ">> / হোম / ক্যামসার্চ / ক্যামস_স্ক্রিপ্ট / টেক্সস্টেস্ট। txt at> <EOT>
পবন কুমার ভার্মা

@ পাভানকুমার ভার্মা - atএকটি ফাইল লেখার জন্য একটি সরল (পরীক্ষিত) উদাহরণ যুক্ত করেছেন । দেখে মনে হচ্ছে আপনি নিজের উদাহরণটিতে কলিং সিকোয়েন্সটি পেছনের দিকে পেয়েছেন। চাকরীটি atকখন চালাবেন তা বলার ক্ষেত্রে আমি খুব একটা ভাল নই , তাই খুব কাছের ভবিষ্যতে আমি কেবল একটি সময়কে কঠোর কোড দিয়েছি।
জো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.