ক্রোন কীভাবে স্ক্রিপ্টগুলি কার্যকর করে সেগুলি সম্পর্কে সাধারণত আমার বেশ কয়েকটি সমস্যা রয়েছে কারণ তাদের সাধারণত আমার পরিবেশগত সেটআপ নেই। ক্রোন কি একইভাবে বাশ (?) আহ্বান করার কোনও উপায় আছে যাতে আমি স্ক্রিপ্টগুলি ইনস্টল করার আগে পরীক্ষা করতে পারি?
ক্রোন কীভাবে স্ক্রিপ্টগুলি কার্যকর করে সেগুলি সম্পর্কে সাধারণত আমার বেশ কয়েকটি সমস্যা রয়েছে কারণ তাদের সাধারণত আমার পরিবেশগত সেটআপ নেই। ক্রোন কি একইভাবে বাশ (?) আহ্বান করার কোনও উপায় আছে যাতে আমি স্ক্রিপ্টগুলি ইনস্টল করার আগে পরীক্ষা করতে পারি?
উত্তর:
এটি আপনার ক্রন্টবে যুক্ত করুন (অস্থায়ীভাবে):
* * * * * env > ~/cronenv
এটি চালানোর পরে, এটি করুন:
env - `cat ~/cronenv` /bin/sh
এটি ধরে নিয়েছে যে আপনার ক্রোন চালায় / বিন / শ, যা ব্যবহারকারীর ডিফল্ট শেল নির্বিশেষে ডিফল্ট।
env -
বিড়াল is / ক্রোননেভ / বিন / শও কি ক্রোন জব হিসাবে লেখা উচিত? দয়া করে একটি উদাহরণ দিন
ক্রোন কেবলমাত্র এই পরিবেশটি ডিফল্টরূপে সরবরাহ করে:
HOME
ব্যবহারকারীর হোম ডিরেক্টরিLOGNAME
ব্যবহারকারীর লগইনPATH=/usr/bin:/usr/sbin
SHELL=/usr/bin/sh
আপনার যদি আরও বেশি প্রয়োজন হয় তবে আপনি এমন একটি স্ক্রিপ্ট উত্স করতে পারবেন যেখানে আপনি ক্রন্টবেলে সময় নির্ধারণের টেবিলের আগে আপনার পরিবেশকে সংজ্ঞায়িত করবেন।
কয়েক পন্থা:
ক্রোন env রফতানি করুন এবং এটি উত্স:
যোগ
* * * * * env > ~/cronenv
আপনার ক্রোনট্যাব এ, এটি একবার চালানো যাক, এটি আবার বন্ধ করুন, তারপরে চালান
env - `cat ~/cronenv` /bin/sh
এবং আপনি এখন একটি sh
অধিবেশনের ভিতরে আছেন যেখানে ক্রনের পরিবেশ রয়েছে
ক্রোন আপনার পরিবেশ আনুন
আপনি ব্যায়ামের উপরের দিকে যেতে পারেন এবং . ~/.profile
আপনার ক্রোন কাজের সামনে কিছু করতে পারেন, যেমন
* * * * * . ~/.profile; your_command
স্ক্রিন ব্যবহার করুন
সর্বোপরি দুটি সমাধান এখনো ব্যর্থ যে তারা একটি চলমান X সেশনের সাথে সংযুক্ত একটি পরিবেশ প্রদান অ্যাক্সেস dbus
উবুন্টু, উপর উদাহরণস্বরূপ ইত্যাদি nmcli
(নেটওয়ার্ক ম্যানেজার) দুটি উপরে কাজ করবে, কিন্তু এখনও ক্রন ব্যর্থ।
* * * * * /usr/bin/screen -dm
উপরে ক্রোনটিতে রেখা যুক্ত করুন, এটি একবার চালানো যাক, এটি আবার বন্ধ করুন। আপনার স্ক্রিন সেশনে (স্ক্রিন-আর) সংযুক্ত করুন। যদি আপনি যাচাই করেন তবে স্ক্রিন সেশনটি তৈরি করা হয়েছে (সহ ps
) সচেতন হন যে তারা কখনও কখনও রাজধানীতে থাকেন (যেমন ps | grep SCREEN
)
এখন এমনকি nmcli
এবং অনুরূপ ব্যর্থ হবে।
আপনি চালাতে পারেন:
env - your_command arguments
এটি খালি পরিবেশের সাথে আপনার_কম্যান্ড চালাবে।
env - HOME="$HOME" LOGNAME="$USER" PATH="/usr/bin:/bin" SHELL="$(which sh)" command arguments
যা মনে হয় কৌশলটি করতে পারে
অ্যাকাউন্টের শেলের উপর নির্ভর করে
sudo su
env -i /bin/sh
অথবা
sudo su
env -i /bin/bash --noprofile --norc
Http://matthew.mceachen.us/blog/howto-simulate-the-cron-enবর্তন 10-10 থেকে এইচটিএমএল থেকে
ছয় বছর পরে উত্তর দেওয়া: systemd
"ক্রম প্রতিস্থাপন হিসাবে" টাইমারদের " সমাধান করা সমস্যাগুলির মধ্যে একটি পরিবেশগত মিল নয় problem আপনি সিএলআই থেকে সিস্টেমড "পরিষেবা" চালনা করুন বা ক্রোনের মাধ্যমে, পরিবেশের অমিল সমস্যাটি এড়ানো এটিকে ঠিক একই পরিবেশ পাওয়া যায়।
ক্রোন জবগুলি ম্যানুয়ালি পাস করার সময় ব্যর্থ হওয়ার সবচেয়ে সাধারণ সমস্যা হ'ল $PATH
ক্রোন দ্বারা সীমাবদ্ধ ডিফল্ট সেট, যা এটি উবুন্টু 16.04 এ রয়েছে:
"/usr/bin:/bin"
বিপরীতে, উবুন্টু 16.04 এ $PATH
সেট করা ডিফল্টটি systemd
হ'ল:
"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
সুতরাং ইতিমধ্যে আরও একটি ভাল সম্ভাবনা রয়েছে যে কোনও সিস্টেমড টাইমার আরও ঝামেলা ছাড়াই বাইনারি আবিষ্কার করতে চলেছে।
সিস্টেমযুক্ত টাইমারগুলির সাথে নেতিবাচক দিকটি হ'ল এগুলি সেট আপ করার জন্য আরও কিছুটা সময় আছে। আপনি প্রথমে কী চালাতে চান তা নির্ধারণ করার জন্য একটি "পরিষেবা" ফাইল এবং এটি চালানোর সময়সূচী নির্ধারণ করার জন্য একটি "টাইমার" ফাইল তৈরি করবেন এবং শেষ পর্যন্ত এটি সক্রিয় করতে টাইমারকে "সক্ষম" করুন।
একটি ক্রোন জব তৈরি করুন যা এনভিভি চালায় এবং স্টাডআউটকে কোনও ফাইলে পুনঃনির্দেশ করে। ক্রোন জব হিসাবে একই পরিবেশ তৈরি করতে "env -" পাশাপাশি ফাইলটি ব্যবহার করুন।
ভুলে যাবেন না যেহেতু ক্রোন এর পিতামাতারা উদ্যোগী, এটি কোনও নিয়ন্ত্রণকারী টার্মিনাল ছাড়াই প্রোগ্রামগুলি চালায়। আপনি এটির মতো একটি সরঞ্জাম দিয়ে তা অনুকরণ করতে পারেন:
ডিফল্টরূপে, cron
আপনার সিস্টেমের ধারণা যা sh
হয় তা ব্যবহার করে এর কাজগুলি কার্যকর করে । প্রকৃত বোর্ন শেল হতে পারে বা dash
, ash
, ksh
বা bash
(অথবা অন্য এক) সিমলিঙ্ক sh
(এবং POSIX মোডে চলমান ফলে)।
করণীয় হ'ল সর্বোত্তম কাজটি হ'ল আপনার স্ক্রিপ্টগুলির যা প্রয়োজন তা নিশ্চিত করা এবং তাদের জন্য কিছুই সরবরাহ করা হয়নি তা ধরে নেওয়া। অতএব, আপনার সম্পূর্ণ ডিরেক্টরি স্পেসিফিকেশন ব্যবহার করা উচিত এবং $PATH
নিজের মতো পরিবেশের ভেরিয়েবলগুলি সেট করা উচিত।
0 0 * * 1 /path/to/executable >/dev/null 2>&1
এবং তারপরে, "এক্সিকিউটেবল" এর মধ্যে আমি $PATH
ইত্যাদির জন্য মান নির্ধারণ করতাম এবং ইনপুট এবং আউটপুট ফাইল ইত্যাদিতে সম্পূর্ণ ডিরেক্টরি স্পেস ব্যবহার করতাম উদাহরণস্বরূপ:/path/to/do_something /another/path/input_file /another/path/to/output_file
আমি খুঁজে পেয়েছি এমন আরও একটি সহজ উপায় (তবে ত্রুটির প্রবণ হতে পারে, আমি এখনও পরীক্ষা করছি) হ'ল আপনার আদেশের আগে আপনার ব্যবহারকারীর প্রোফাইল ফাইলগুলি উত্স করা।
একটি /etc/cron.d/ স্ক্রিপ্ট সম্পাদনা করা হচ্ছে:
* * * * * user1 comand-that-needs-env-vars
পরিণত হবে:
* * * * * user1 source ~/.bash_profile; source ~/.bashrc; comand-that-needs-env-vars
নোংরা, তবে এটি আমার জন্য কাজটি করেছে। লগইন অনুকরণ করার কোন উপায় আছে? আপনি কি চালাতে পারেন? bash --login
কাজ হয়নি। মনে হচ্ছে এটি যাওয়ার আরও ভাল উপায় হবে।
সম্পাদনা: এটি একটি কঠিন সমাধান বলে মনে হচ্ছে: http://www.epicserve.com/blog/2012/feb/7/my-notes-cron-directory-etccrond-ubuntu-1110/
* * * * * root su --session-command="comand-that-needs-env-vars" user1 -l
গৃহীত উত্তর পরিবেশ ক্রোন ব্যবহার করে একটি স্ক্রিপ্ট চালানোর উপায় দেয়। অন্যরা যেমন উল্লেখ করেছে, ক্রোন জবগুলি ডিবাগ করার জন্য এটি কেবলমাত্র প্রয়োজনীয় মানদণ্ড নয়।
প্রকৃতপক্ষে ক্রোন কোনও সংযুক্ত ইনপুট ব্যতীত একটি অ-ইন্টারেক্টিভ টার্মিনালও ব্যবহার করে
যদি এটি সহায়তা করে তবে আমি একটি স্ক্রিপ্ট লিখেছি যা ক্রোন দ্বারা চালিত হবে এমনভাবে একটি কমান্ড / স্ক্রিপ্টকে বেদনাদায়কভাবে চালানো সক্ষম করে। এটি প্রথম আর্গুমেন্ট হিসাবে আপনার কমান্ড / স্ক্রিপ্ট দিয়ে চাওয়া এবং আপনি ভাল।
এই স্ক্রিপ্টটি গিথুব-এ হোস্ট করা হয়েছে (এবং সম্ভবত আপডেট করা হয়েছে) ।
#!/bin/bash
# Run as if it was called from cron, that is to say:
# * with a modified environment
# * with a specific shell, which may or may not be bash
# * without an attached input terminal
# * in a non-interactive shell
function usage(){
echo "$0 - Run a script or a command as it would be in a cron job, then display its output"
echo "Usage:"
echo " $0 [command | script]"
}
if [ "$1" == "-h" -o "$1" == "--help" ]; then
usage
exit 0
fi
if [ $(whoami) != "root" ]; then
echo "Only root is supported at the moment"
exit 1
fi
# This file should contain the cron environment.
cron_env="/root/cron-env"
if [ ! -f "$cron_env" ]; then
echo "Unable to find $cron_env"
echo "To generate it, run \"/usr/bin/env > /root/cron-env\" as a cron job"
exit 0
fi
# It will be a nightmare to expand "$@" inside a shell -c argument.
# Let's rather generate a string where we manually expand-and-quote the arguments
env_string="/usr/bin/env -i "
for envi in $(cat "$cron_env"); do
env_string="${env_string} $envi "
done
cmd_string=""
for arg in "$@"; do
cmd_string="${cmd_string} \"${arg}\" "
done
# Which shell should we use?
the_shell=$(grep -E "^SHELL=" /root/cron-env | sed 's/SHELL=//')
echo "Running with $the_shell the following command: $cmd_string"
# Let's route the output in a file
# and do not provide any input (so that the command is executed without an attached terminal)
so=$(mktemp "/tmp/fakecron.out.XXXX")
se=$(mktemp "/tmp/fakecron.err.XXXX")
"$the_shell" -c "$env_string $cmd_string" >"$so" 2>"$se" < /dev/null
echo -e "Done. Here is \033[1mstdout\033[0m:"
cat "$so"
echo -e "Done. Here is \033[1mstderr\033[0m:"
cat "$se"
rm "$so" "$se"
উত্তর https://stackoverflow.com/a/2546509/5593430 কীভাবে ক্রোন পরিবেশ পাবেন এবং এটি আপনার স্ক্রিপ্টের জন্য ব্যবহার করবেন তা দেখায়। তবে সচেতন হন যে আপনার ব্যবহৃত ক্রন্টব ফাইলের উপর নির্ভর করে পরিবেশটি পৃথক হতে পারে। এর মাধ্যমে পরিবেশ বাঁচাতে আমি তিনটি আলাদা ক্রোন এন্ট্রি তৈরি করেছি env > log
। এগুলি একটি অ্যামাজন লিনাক্স 4.4.35-33.55.amzn1.x86_64 এ ফলাফল।
MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
PWD=/
LANG=en_US.UTF-8
SHLVL=1
HOME=/
LOGNAME=root
_=/bin/env
crontab -e
)SHELL=/bin/sh
USER=root
PATH=/usr/bin:/bin
PWD=/root
LANG=en_US.UTF-8
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env
MAILTO=root
SHELL=/bin/bash
USER=root
PATH=/sbin:/bin:/usr/sbin:/usr/bin
_=/bin/env
PWD=/
LANG=en_US.UTF-8
SHLVL=3
HOME=/
LOGNAME=root
সবচেয়ে গুরুত্বপূর্ণ PATH
, PWD
এবং HOME
পৃথক। একটি স্থিতিশীল পরিবেশের উপর নির্ভর করতে আপনার ক্রোন স্ক্রিপ্টগুলিতে সেট করার বিষয়টি নিশ্চিত করুন।
আমি বিশ্বাস করি না যে আছে; ক্রোন জব পরীক্ষা করার একমাত্র উপায়টি হ'ল ভবিষ্যতে এক বা দুই মিনিট চালানোর জন্য এটি সেট আপ করা এবং তারপরে অপেক্ষা করুন।