আমি কোনও স্ক্রিপ্টের দ্বারা পৃথক ফাইলে যে পরিমাণ নির্বাহ করা হয়েছে তার সংখ্যা লগইন করব কীভাবে?


11

আমার একটি স্ক্রিপ্ট লিখতে হবে যা একটি স্ক্রিপ্ট লিখতে লিখতে এই স্ক্রিপ্টটি কতবার কার্যকর হয়েছে।

আমি এটা কিভাবে করবো?

উত্তর:


15

আমি ধরে নিয়েছি যে আপনার কাছে একটি একক ফাইল থাকতে চান countfileযা কেবলমাত্র একটি একক সংখ্যা ধারণ করে যা এক্সিকিউশন কাউন্টারকে উপস্থাপন করে।

আপনি এই কাউন্টারটি শেল ভেরিয়েবলের মধ্যে পড়তে পারেন $counterযেমন এই লাইনের একটি ব্যবহার করে:

  • read counter < countfile
  • counter=$(cat countfile)

$(( EXPRESSION ))সিনট্যাক্স ব্যবহার করে ব্যাশ নিজেই সাধারণ পূর্ণসংখ্যার সংযোজন করা যেতে পারে । তারপরে কেবল ফলাফলটি আমাদের কাছে ফিরে লিখুন countfile:

echo "$(( counter + 1 ))" > countfile

আপনার স্ক্রিপ্টটি সম্ভবত সেই ক্ষেত্রেটির জন্য রক্ষা করা উচিত যা countfileএখনও বিদ্যমান নেই এবং 1 টির সাথে প্রথমে একটি তৈরি করা উচিত।

পুরো জিনিসটি দেখতে এরকম হতে পারে:

#!/bin/bash
if [[ -f countfile ]] ; then
    read counter < countfile
else
    counter=0
fi
echo "$(( counter + 1 ))" > countfile

2
… বা echo $(( $(cat countfile 2>/dev/null || echo 0) + 1 )) > countfile
এটির

1
দুর্দান্ত, এটি @ পার্লডাকের পাশাপাশি কাজ করবে বলে মনে হচ্ছে। আমি ভীত ছিলাম এটি পড়ার আগে এটি ওভার রাইটিংয়ের জন্য ফাইলটি খুলতে পারে, তবে দৃশ্যত প্রক্রিয়া প্রতিস্থাপন সিনট্যাক্স এটি প্রতিরোধ করে বলে মনে হচ্ছে।
বাইট কমান্ডার

ভাল যুক্তি. আমি নিশ্চিত যে এটির গ্যারান্টেড কিনা $(…)অন্য যে কোনও কিছুর আগেই (বিশেষত এর আগে >) মৃত্যুদন্ড কার্যকর হয়েছিল । তবে $(cat countfile 2>/dev/null || echo 0)ফাইলটি উপস্থিত না থাকলে আমি প্রায়শই যুক্তিযুক্ত ডিফল্ট পেতে অংশটি ব্যবহার করি । আমরা spongeনিরাপদ থাকতে একটি :-) যুক্ত করতে পারি।
পার্লডাক

2
এই উত্তরটি flockজাতির শর্তগুলি রোধ করার জন্য একটি গণনা কোডটি একটি কমান্ডে মোড়ানো দ্বারা উন্নত হবে । দেখুন unix.stackexchange.com/a/409276
rrauenza

5

কেবল স্ক্রিপ্টটিকে একটি লগ ফাইল তৈরি করতে দিন, উদাহরণস্বরূপ আপনার স্ক্রিপ্টে একটি লাইন যুক্ত করুন:

echo "Script has been executed at $(date +\%Y-\%m-\%d) $(date +\%H-\%M-\%S)" >> ~/script.log

আপনি নিজের উপস্থাপনের তারিখ এবং সময় যেভাবে নিজেই ফর্ম্যাট করতে পারেন তবে আপনি যদি পুরো তারিখ এবং সময় নিয়ে যেতে চান (এবং HH:MM:SSএটি আপনার কাছে একটি গ্রহণযোগ্য বিন্যাস) তবে আপনি সহজভাবে ব্যবহার করতে পারেন:

echo "Script has been executed at $(date +\%F-\%T)" >> ~/script.log

তাহলে আপনি করতে পারেন:

wc -l ~/script.log

যা নিউলাইন চরিত্রগুলিকে গণনা করে এবং লগ ফাইলের মধ্যে কতগুলি লাইন রয়েছে তার একটি অনুমান দেয়। লগ ফাইলের মধ্যে এটি কার্যকর করা হলেও আপনি দেখতে পাচ্ছেন। এটি আপনার প্রয়োজনের সাথে খাপ খাইয়ে নিতে, আপনি লগিংয়ের জন্য ব্যবহৃত পাথ এবং নাম পরিবর্তন করতে পারেন। আমি এখানে একটি উদাহরণ দিয়েছি যা লগ-ফাইলে সংরক্ষণ করে ~

সুতরাং উদাহরণস্বরূপ আপনি চান যে স্ক্রিপ্টটি আপনার স্ক্রিপ্টের শেষে আপনি যুক্ত করেছেন এমন লাইনে এই গণনাটি যুক্ত করুন আপনি আপনার স্ক্রিপ্টের শুরুতে এই জাতীয় কিছু করতে পারেন:

count=$(( $(wc -l ~/script.log | awk '{print $1}') + 1 ))
# the next line can be simply skipped if you not want an output to std_out
echo "Script execution number: $count"

এবং স্ক্রিপ্টের শেষে আপনার লাইনটি এমন কিছু তথ্য এমনকি কিছুতে পরিবর্তন করুন:

echo "Script has been executed $count times at $(date +\%F-\%T)" >> ~/script.log

5

এই সমাধানটি বাইট কমান্ডারের উত্তরের মতো একই পদ্ধতির ব্যবহার করে তবে এটি শেল গাণিতিক বা অন্যান্য বাশিমের উপর নির্ভর করে না।

exec 2>&3 2>/dev/null
read counter < counter.txt || counter=0
exec 3>&2 3>&-
expr "$counter" + 1 > counter.txt

স্ট্রিম পুনর্নির্দেশগুলি

  1. স্ট্যান্ডার্ড ত্রুটি প্রবাহকে (2) একটি আলাদা ফাইল বর্ণনাকারী (3) এ নকল করুন,
  2. এটির (2) পুনর্নির্দেশের সাথে প্রতিস্থাপন করুন ( যদি কাউন্টারের ফাইল প্রত্যাশিতভাবে অনুপস্থিত থাকে তবে কমান্ডের /dev/nullইনপুটটির পরবর্তী পুনঃনির্দেশে ত্রুটি বার্তাটি দমন করতে read),
  3. পরে মূল স্ট্যান্ডার্ড ত্রুটি প্রবাহটি (এখন 3 এ) জায়গায় ফিরে (2) এবং নকল করুন
  4. স্ট্যান্ডার্ড ত্রুটি প্রবাহের অনুলিপিটি বন্ধ করুন (3)।

1

একটি ভিন্ন পদ্ধতির

একটি পৃথক কাউন্টার ফাইলের অসুবিধা রয়েছে:

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

সুতরাং এই উত্তরটি পৃথক কাউন্টার ফাইল বন্ধ করে দেয় এবং গণনাটিকে নিজেই স্ক্রিপ্টে রেখে দেয়!

  • বাশ স্ক্রিপ্টে কাউন্টার স্থাপন করা আপনাকে নিজের স্ক্রিপ্টের মধ্যে নিজেই এটি দেখতে দেয় যে এটি কতবার চালানো হয়েছে।
  • flockগ্যারান্টি ব্যবহার করে যে সংক্ষিপ্ত মুহুর্তের জন্য দু'জন ব্যবহারকারী একই সাথে স্ক্রিপ্ট চালানো সম্ভব নয়।
  • যেহেতু কাউন্টার ফাইলের নামটি হার্ড কোডড নয়, আপনাকে বিভিন্ন স্ক্রিপ্টগুলির জন্য কোড পরিবর্তন করার দরকার নেই, আপনি কেবল এটি উত্সটি তৈরি করতে পারেন বা স্টাব / বয়লারপ্লেট ফাইল থেকে এটি অনুলিপি এবং অনুলিপি করতে পারেন।

কোড

#!/bin/bash

# NAME: run-count.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: /ubuntu/988032/how-can-i-cause-a-script-to-log-in-a-separate-file-the-number-of-times-it-has-be

# DATE: Mar 16, 2018.

# This script run count: 0

# ======== FROM HERE DOWN CAN GO INTO FILE INCLUDED WITH SOURCE COMMAND =======

[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :
#     This is useful boilerplate code for shell scripts.  Put it at the top  of
#     the  shell script you want to lock and it'll automatically lock itself on
#     the first run.  If the env var $FLOCKER is not set to  the  shell  script
#     that  is being run, then execute flock and grab an exclusive non-blocking
#     lock (using the script itself as the lock file) before re-execing  itself
#     with  the right arguments.  It also sets the FLOCKER env var to the right
#     value so it doesn't run again.

# Read this script with entries separated newline " " into array
mapfile -t ScriptArr < "$0"

# Build search string that cannot be named
SearchStr="This script"
SearchStr=$SearchStr" run count: "

# Find our search string in array and increment count
for i in ${!ScriptArr[@]}; do
    if [[ ${ScriptArr[i]} = *"$SearchStr"* ]]; then
        OldCnt=$( echo ${ScriptArr[i]} | cut -d':' -f2 )
        NewCnt=$(( $OldCnt + 1 ))
        ScriptArr[i]=$SearchStr$NewCnt
        break
    fi
done

# Rewrite our script to disk with new run count
# BONUS: Date of script after writing will be last run time
printf "%s\n" "${ScriptArr[@]}" > "$0"

# ========= FROM HERE UP CAN GO INTO FILE INCLUDED WITH SOURCE COMMAND ========

# Now we return you to your original programming....

exit 0

লগ ফাইল ব্যবহার করে অন্য একটি পদ্ধতি

ভিডিয়োনাথের উত্তরের অনুরূপ আমি এখানে একটি লগ ফাইলের উত্তর লিখেছি: প্রতিবারের শক্তির সাথে বা ততক্ষণ ব্যবহারের সময় নিরীক্ষণ ট্রেল / লগ অ্যাক্সেস করা ফাইলগুলির লগ বজায় রাখতে বাশ স্ক্রিপ্টgeditnautilus

gksuস্ক্রিপ্টটি ব্যবহার করার পরিবর্তে ধরা পড়ার নাম দেওয়া হয়েছে gsuএবং জিইউআইতে pkexecসুডো ব্যবহারের "আধুনিক" পদ্ধতির প্রতি আহ্বান জানানো হয়েছে, তাই আমাকে বলা হয়েছে।

আরেকটি সুবিধা হ'ল এটি নয় যে প্রতিবার রুট শক্তি ব্যবহার করা হয়েছিল geditতবে এটি সম্পাদিত ফাইলের নাম লগ করে। কোডটি এখানে।

~/bin/gsu:

#!/bin/bash

# Usage: gsu gedit file1 file2...
#  -OR-  gsu natuilus /dirname

# & is used to spawn process and get prompt back ASAP
# > /dev/null is used to send gtk warnings into dumpster

COMMAND="$1" # extract gedit or nautilus

pkexec "$COMMAND" "${@:2}"

log-file "${@:2}" gsu-log-file-for-"$COMMAND"

/usr/local/bin/log-file:

#! /bin/bash

# NAME: log-file
# PATH: /usr/local/bin
# DESC: Update audit trail/log file with passed parameters.
# CALL: log-file FileName LogFileName
# DATE: Created Nov 18, 2016.
# NOTE: Primarily called from ~/bin/gsu

ABSOLUTE_NAME=$(realpath "$1")
TIME_STAMP=$(date +"%D - %T")
LOG_FILE="$2"

# Does log file need to be created?
if [ ! -f "$LOG_FILE" ]; then
    touch "$LOG_FILE"
    echo "__Date__ - __Time__ - ______File Name______" >> "$LOG_FILE"
    #     MM/DD/YY - hh:mm:ss - "a/b/c/FileName"
fi

echo "$TIME_STAMP" - '"'"$ABSOLUTE_NAME"'"' >> "$LOG_FILE"

exit 0

gsu-log-file-for-geditকয়েকটি সম্পাদনার পরে লগ ফাইলের বিষয়বস্তু :

__Date__ - __Time__ - ______File Name______
11/18/16 - 19:07:54 - "/etc/default/grub"
11/18/16 - 19:08:34 - "/home/rick/bin/gsu"
11/18/16 - 19:09:26 - "/home/rick/bin/gsu"
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.