প্রোগ্রামটমেটিকভাবে crontab এ কিছু যুক্ত করুন (ওভার ssh)


13

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

(আমি চালাতে পারি xxx.py deploy envবা xxx.py update env)

সুতরাং আমি এটি করতে হবে:

Check if my cronJob already exist
Put my cronJob if it does not already exist
or
update my cronjob if one of the parameter of the command is different

আমি ফাইলটি crontabব্যবহার crontab -eবা সম্পাদনা না করে কীভাবে কিছু যুক্ত / চেক / সরিয়ে ফেলতে দেখছি না crontab(এটি ডাউনলোড করুন, এটি পুনরায় লিখুন, পুনরায় আপলোড করুন)

পিএস: এটি একটি ব্যবহারকারী নির্দিষ্ট ক্রোনজব, "ওয়েবডমিন" এটি করতে চলেছে এবং এটি এটি করতে সুডো ব্যবহার করা উচিত নয়।


1
এটি কি কোনও ব্যবহারকারী-নির্দিষ্ট ক্রন্টবায় থাকতে হবে? বেশিরভাগ প্রিপেইকেজড ক্রোন জব /etc/cron.* ডিরেক্টরিগুলির মধ্যে একটিতে চলে।
একটি সিভিএন

CentOS আছে /etc/cron.d? যদি তা হয় তবে আপনার স্ক্রিপ্টটি সেখানে আপনার অ্যাপ্লিকেশনটির জন্য অনন্য একটি নাম ব্যবহার করে
রাখুন

হ্যাঁ এটি ব্যবহারকারী নির্দিষ্ট। আমি এটিকে /etc/cron.d এ যুক্ত করতে পারি না কারণ এটি একটি মূল ফাইল, সুতরাং কেবলমাত্র রুটের কাজটি ভিতরে প্রবেশ করা হয় (আমি সুডো করতে পারি তবে একটি খারাপ অনুশীলন যা আমাকে বলা হয়েছে)
স্লাইডার_আলফা

1
একইভাবে /etc/crontab, ফাইলগুলির /etc/cron.d/ব্যবহারকারীর নামটির জন্য অতিরিক্ত ক্ষেত্র রয়েছে, তফসিলের নির্দিষ্ট পরে। যেমন * * * * * username /path/to/script। দেখুন man 5 crontabএবং অনুসন্ধান করুন SYSTEM CRON
ক্যাস

উত্তর:


15

আমার সেরা ধারণা এখন পর্যন্ত

সেখানে কী থাকতে হবে সেই বিষয়বস্তুর সাথে মেলে কিনা তা পরীক্ষা করে প্রথমে তা আপডেট না করে:

if [[ $(crontab -l | egrep -v "^(#|$)" | grep -q 'some_command'; echo $?) == 1 ]]
then
    echo $(crontab -l ; echo '* 1 * * * some_command') | crontab -
fi

তবে ক্রোন টাস্কটির চারপাশে একটি পৃথক স্ক্রিপ্ট তৈরি করতে এটি যথেষ্ট জটিল হয়ে পড়ে।

অন্যান্য ধারণা

আপনি স্ট্রিনের মাধ্যমে ক্রন্টবটিতে স্ট্রিংটি প্রেরণ করতে পারবেন (সাবধান, এটি কোনও পূর্ববর্তী ক্রন্টব এন্ট্রি সাফ করে দেয়):

echo "* 1 * * * some_command" | crontab -

এটি এমনকি ssh এর মাধ্যমে কাজ করা উচিত:

echo "* 1 * * * some_command" | ssh user@host "crontab -"

আপনি যদি ফাইলটিতে যুক্ত করতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

# on the machine itself
echo "$(echo '* 1 * * * some_command' ; crontab -l)" | crontab -
# via ssh
echo "$(echo '* 1 * * * some_command' ; ssh user@host crontab -l)" | ssh user@host "crontab -"

যে নির্ভর করে: আপনি কি সেখানে প্রয়োজন হত প্রয়োজন? :)
ফিলিপ -জায়ান কে লি- স্টকম্যান

awww ... মূল হিসাবে চলমান না? ... আমি এটি আবার
লিখব

হ্যাঁ, আমি এটি পছন্দ করি: ডি
স্লাইডার_আল্ফা

এই সমাধানটি নিয়ে আমার দুটি সমস্যা ছিল: 1) ফাইলগুলির একটি তালিকাতে echo '*...প্রসারিত *। 2) ক্রন্টবায় লাইনটি শেষ হয়ে গেছে।
রাফটারি

আমি এই সমস্যার সমাধান করতে সক্ষম হয়েছি: 1) echo "*...এবং 2) echo $লাইনটি শুরু থেকে সরান ।
রাফারি

3

রেকর্ডের জন্য আমি ব্যবহারের পরামর্শ দিতে যাচ্ছি /etc/cron.d/। এখানে শুধুমাত্র রুট ফাইল লিখতে পারে তবে এন্ট্রিগুলি কোনও ব্যবহারকারীর হিসাবে চালানো যেতে পারে (প্রয়োজন ছাড়াই sudo)।

echo '0 0 * * 0 webadmin /usr/local/bin/tidy_logfiles' > ~/webadmin.cron
scp -p ~/webadmin.cron root@remote_host:/etc/cron.d/webadmin

স্থানীয় webadmin.cronফাইলটি অনুলিপি করার আগে প্রয়োজনীয় হিসাবে আপডেট করে এটি একাধিকবার প্রয়োগ করা যেতে পারে ।

আপনি এমনকি বিধান অপসারণ করতে পারেন:

ssh -q root@remote_host rm -f /etc/cron.d/webadmin

মনে রাখবেন যে অনেক ক্ষেত্রে আপনি scp/ sshকমান্ডের জন্য রুটের পাসওয়ার্ড সরবরাহ করতে পারবেন না । পরিবর্তে আপনার পাবলিক / প্রাইভেট কী সার্টিফিকেট স্থাপন করা দরকার। এছাড়াও, জড়িত হয়ে স্থানীয় অ্যাকাউন্টে (এটি যাই হোক না কেন) দূরবর্তী সার্ভারে সম্পূর্ণ রুট অ্যাক্সেস থাকবে। এটি আপনার নির্দিষ্ট দৃশ্যের জন্য শো-স্টপার হবে কিনা তা এই মুহূর্তে অস্পষ্ট।


এটি আমার ক্লায়েন্ট সার্ভার, আমি রুট হিসাবে লগইন করতে পারি না, তবে আমি এটির মধ্যে sudo করতে পারি, তবে যদি আমি তা করি তবে তারা আমাকে মেরে ফেলবে। এটি একটি ওয়েবএডলমিন কাজ তাই এটি কেবল ওয়েবডমিন স্টাফের মধ্যে থাকা উচিত, সিসাদমিন আমাকে এটাই বলেছিল।
স্লাইডার_সালফ 21:40 '

@ স্লাইডার্স_আল্ফার কাজটি কেবল ওয়েবডমিন হিসাবে চালিত হয়। এটি এমন বিধান যা মূল সমতুল্যতা প্রয়োজন। তবে, আমি একটি অ-মূল সমাধানও সন্ধান করব।
রোয়াইমা

1
+1 টি। /etc/cron.d/ঠিক এই উদ্দেশ্যে উপস্থিত রয়েছে - যাতে প্যাকেজ / মোতায়েন কেবল একটি ক্রন্টব ফাইল এখানে ফেলে দিতে পারে।
সি এ এস

3

আমি আপনার নিজের ঘূর্ণায়মানের পরিবর্তে এর জন্য উত্তরযোগ্য * ব্যবহার করার পরামর্শ দিচ্ছি। বা পুতুল বা শেফ - তবে জবাব শূন্য-পরিকাঠামো এই জাতীয় স্ক্রিপ্ট মোতায়েনের জন্য উপযুক্ত।

এর কারণ এটি ইতিমধ্যে এরকম সমস্যাগুলি সমাধান করার জন্য মডিউলগুলি ইতিমধ্যে রয়েছে এবং কনফিগারেশন পরিচালনার সরঞ্জামগুলির একটি বুনিয়াদি নকশা লক্ষ্য হিসাবে আদর্শিকতা রয়েছে - এটি কেবল তখনই পরিবর্তনের সম্পত্তি যখন আপনার প্রয়োজন হয় দুর্ঘটনাক্রমে (বা ইচ্ছাকৃতভাবে) আবার চালানো দরকার।

বিশেষত, আনসিবলের ক্রোন মডিউলটি ব্যবহারকারী ক্রন্টাবগুলি পরিবর্তন করতে পারে। বোনাস হিসাবে, আপনি যদি পরে সিস্টেম ক্রন্টাবগুলি ব্যবহার করতে সামঞ্জস্য করতে চান তবে এটি পুনর্লিখনের পরিবর্তে খুব সহজ ঝাঁকুনি হবে।


* অস্বীকৃতি: আমি রেড হ্যাট এর জন্য কাজ করি, এবং উত্তরীয় একটি রেড হ্যাট স্পনসরিত প্রকল্প।


হ্যাঁ, ব্যাপারটি হল, আমি 2 মাস আগে জবাবদিহি সম্পর্কে জানতাম না, এবং এখন আমাদের কাছে একটি বিশাল অজগর স্থাপনকারী স্ক্রিপ্ট রয়েছে (তবে তিনি ম্যাগনিফিসিয়েন্ট, পঠনযোগ্য, রক্ষণাবেক্ষণযোগ্য,;)) পরের বার, আমি উত্তরদণ্ড ব্যবহার করব তবে ঠিক এখন চলছে ফিরে অসম্ভব (অর্থের অর্থের অর্থ)
স্লাইডার_সালফ

1

আপনি যদি লক্ষ্য অ্যাকাউন্টের মাধ্যমে ক্রোন জব যুক্ত করতে চান তবে চালান crontab -e। এই কমান্ডটি একটি সম্পাদকের মাধ্যমে ক্রন্টবটি পাস করে। এডিটর কমান্ডটি ব্যবহার করতে বলুন যা আপনার ইচ্ছামতো ক্রন্টবটি পরিবর্তন করে। সম্পাদক কমান্ড শেল স্নিপেট হিসাবে একটি অস্থায়ী ফাইল সংযোজন করা নাম সহ সম্পাদন করা হয়।

unset VISUAL
EDITOR='update_crontab () {
  set -e
  new=$(mktemp)
  if <"$1" grep -v "^#" | grep -w do_stuff; then
    # Remove existing entries containing do_stuff
    grep -v -w do_stuff "$1" >"$new"
  else
    cp "$1" "$new"
  fi
  # Add the new entry
  echo "1 2 3 4 5 do_stuff --new-options" >>"$new"
  mv "$new" "$1"
}
update_crontab' crontab -e

এই পদ্ধতির দেশীয়ের তুলনায় আরও নির্ভরযোগ্য crontab -l | … | crontab -কারণ ক্রোনটাব একসাথে সম্পাদনা করা হলে এটি একটি বর্ণের শর্তের পক্ষে ঝুঁকিপূর্ণ: কলটিতে crontab -lএবং কল করার মধ্যে করা পরিবর্তনগুলি crontab -পূর্বাবস্থায় ফিরে যাবে না।


1

এটি " ফিলিপ-জায়ান-কে-লি-স্টকম্যান " তার "এখন পর্যন্ত সেরা ধারণা" কোডের ভিত্তিতে কী অফার করেছে তার একটি রূপান্তর ।

তার (সেরা এবং সহায়ক স্নিপেট) থেকে আমার পরিবর্তনগুলি মূলত:

  • কেবল কমান্ডের নাম নয়, টাইম স্ট্রিং সহ পুরো এন্ট্রিের জন্য রেজেক্স। অন্য এন্ট্রিগুলিতে একই নামযুক্ত বা ওভারল্যাপিং-নামক কমান্ড থাকলেও এটি একটি কমান্ড যুক্ত সমর্থন করতে পারে support (এটি এখনও একই সময়সূচীতে দু'বার একই কমান্ড যুক্ত করবে না))
  • কিছুটা লগিং
  • আমি বিভিন্ন কারণে আমার ঘন্টার প্রতি ঘন্টা (এবং নামকরণ) স্যুইচ করেছি; এটি প্রতি ক্রন্টাব সিনট্যাক্সে ফিরে সমন্বয় করা সহজ

এবং তাই আমি যা বলেছিলাম তার জন্য এখানে আমার কোডটি রয়েছে crontab-add-hourly.sh:

#!/bin/bash

# PURPOSE:
# To allow simple, programmatic addition of commands/entries into the crontab (if not already present)

cmd=$1
entry="0 * * * * $cmd"
printf "we want to add this entry:\n$entry\n\n" 
escapedEntry=$(printf '%s\n' "$entry" | sed 's:[][\/.^$*]:\\&:g') #from: https://unix.stackexchange.com/a/129063/320236
printf "but first we'll see if it's already in there using this regex pattern:\n$escapedEntry\n\n"

if [[ $(crontab -l | egrep -v '^(#|$)' | grep -q "$escapedEntry"; echo $?) == 1 ]] # from: https://unix.stackexchange.com/a/297377/320236
then
    printf "all clear; pattern was not already present; adding command to crontab hourly:\n$cmd\n\n"
    (crontab -l ; printf "$entry\n\n") | crontab -
else
    printf "pattern already present; no action taken\n\n"
fi

ব্যবহার এবং আউটপুট উদাহরণ:

$ ./crontab-add-hourly.sh my-script.bash

we want to add this entry:
0 * * * * my-script.bash

but first we'll see if it's already in there using this regex pattern:
0 \* \* \* \* my-script\.bash

all clear; pattern was not already present; adding command to crontab hourly:
my-script.bash

0

টিএল; ডিআর: এটি বাস্তবে কাজ করে, বাশ ৪.৪ এ পরীক্ষিত।

if [[ $(crontab -l | egrep -v "^(#|$)" | grep -q 'some_command'; echo $?) == 1 ]]
then
    set -f
    printf "$(crontab -l ; echo '* * * * * some_command')\n" | crontab -
    set +f
fi

@ ফিলিপ-জিয়ান কে লি-স্টকম্যান উত্তরের মন্তব্যে যেমন উল্লেখ করা হয়েছে, সেই সমাধানটি *বর্তমান ডিরেক্টরিতে সমস্ত ফাইলের মধ্যে প্রসারিত হয়েছে। আমি মন্তব্যগুলির পরামর্শটি কাজ করতে পারিনি। সেট -f ওয়াইল্ডকার্ড সম্প্রসারণ অক্ষম করে, https://stackoverflow.com/a/11456496/915441 দেখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.