এনভায়রনমেন্ট ক্রোন অনুকরণ কিভাবে একটি স্ক্রিপ্ট সঙ্গে?


253

ক্রোন কীভাবে স্ক্রিপ্টগুলি কার্যকর করে সেগুলি সম্পর্কে সাধারণত আমার বেশ কয়েকটি সমস্যা রয়েছে কারণ তাদের সাধারণত আমার পরিবেশগত সেটআপ নেই। ক্রোন কি একইভাবে বাশ (?) আহ্বান করার কোনও উপায় আছে যাতে আমি স্ক্রিপ্টগুলি ইনস্টল করার আগে পরীক্ষা করতে পারি?


আমি এই সমাধানটি সুপারিশ করব: unix.stackexchange.com/questions/27289/…
rudi

@ গ্রেগসেইথকে আরও খানিকটা এগিয়ে নিয়ে আমি এই সমাধানটি দিয়েছি
রবার্ট ব্রিসিটা

উত্তর:


385

এটি আপনার ক্রন্টবে যুক্ত করুন (অস্থায়ীভাবে):

* * * * * env > ~/cronenv

এটি চালানোর পরে, এটি করুন:

env - `cat ~/cronenv` /bin/sh

এটি ধরে নিয়েছে যে আপনার ক্রোন চালায় / বিন / শ, যা ব্যবহারকারীর ডিফল্ট শেল নির্বিশেষে ডিফল্ট।


5
দ্রষ্টব্য: যদি এটি বিশ্বব্যাপী / ইত্যাদি / ক্রন্টবে যুক্ত হয় তবে আপনার ব্যবহারকারীর নামও খুব দরকার। উদাহরণস্বরূপ * * * * * রুট এনএনভি> ~ / ক্রোনেনভ
গ্রেগ

10
ভাল, সহজ ধারণা। অধৈর্য্যের জন্য পরের মিনিটে দৌড়াতে '* * * * *' ব্যবহার করুন এবং আপনার খেলা শেষ হয়ে গেলে আবার বন্ধ করতে ভুলবেন না ;-)
ম্যাডস বুস

5
@ ম্যাডসন পূর্ববর্তী বাশ শেলের দিকে ফিরে আসতে চেষ্টা করুন: প্রস্থান করুন
স্পেকানে

5
এই উত্তরের গুরুত্বকে অবমূল্যায়ন করা যায় না। কোনও বইয়ে অনুচ্ছেদে অন্তর্ভুক্তি thy
Xofo

1
env - বিড়াল is / ক্রোননেভ / বিন / শও কি ক্রোন জব হিসাবে লেখা উচিত? দয়া করে একটি উদাহরণ দিন
জাভাসা

61

ক্রোন কেবলমাত্র এই পরিবেশটি ডিফল্টরূপে সরবরাহ করে:

  • HOME ব্যবহারকারীর হোম ডিরেক্টরি
  • LOGNAME ব্যবহারকারীর লগইন
  • PATH=/usr/bin:/usr/sbin
  • SHELL=/usr/bin/sh

আপনার যদি আরও বেশি প্রয়োজন হয় তবে আপনি এমন একটি স্ক্রিপ্ট উত্স করতে পারবেন যেখানে আপনি ক্রন্টবেলে সময় নির্ধারণের টেবিলের আগে আপনার পরিবেশকে সংজ্ঞায়িত করবেন।


7
.সুরক্ষার কারণে সাধারণত আর অংশ হয় PATHনা ।
l0b0

49

কয়েক পন্থা:

  1. ক্রোন env রফতানি করুন এবং এটি উত্স:

    যোগ

    * * * * * env > ~/cronenv

    আপনার ক্রোনট্যাব এ, এটি একবার চালানো যাক, এটি আবার বন্ধ করুন, তারপরে চালান

    env - `cat ~/cronenv` /bin/sh

    এবং আপনি এখন একটি shঅধিবেশনের ভিতরে আছেন যেখানে ক্রনের পরিবেশ রয়েছে

  2. ক্রোন আপনার পরিবেশ আনুন

    আপনি ব্যায়ামের উপরের দিকে যেতে পারেন এবং . ~/.profileআপনার ক্রোন কাজের সামনে কিছু করতে পারেন, যেমন

    * * * * * . ~/.profile; your_command
  3. স্ক্রিন ব্যবহার করুন

    সর্বোপরি দুটি সমাধান এখনো ব্যর্থ যে তারা একটি চলমান X সেশনের সাথে সংযুক্ত একটি পরিবেশ প্রদান অ্যাক্সেস dbusউবুন্টু, উপর উদাহরণস্বরূপ ইত্যাদি nmcli(নেটওয়ার্ক ম্যানেজার) দুটি উপরে কাজ করবে, কিন্তু এখনও ক্রন ব্যর্থ।

    * * * * * /usr/bin/screen -dm

    উপরে ক্রোনটিতে রেখা যুক্ত করুন, এটি একবার চালানো যাক, এটি আবার বন্ধ করুন। আপনার স্ক্রিন সেশনে (স্ক্রিন-আর) সংযুক্ত করুন। যদি আপনি যাচাই করেন তবে স্ক্রিন সেশনটি তৈরি করা হয়েছে (সহ ps) সচেতন হন যে তারা কখনও কখনও রাজধানীতে থাকেন (যেমন ps | grep SCREEN)

    এখন এমনকি nmcliএবং অনুরূপ ব্যর্থ হবে।


22

আপনি চালাতে পারেন:

env - your_command arguments

এটি খালি পরিবেশের সাথে আপনার_কম্যান্ড চালাবে।


4
ক্রোন সম্পূর্ণ শূন্য পরিবেশে চলে না, তাই না?
jldupont

2
গ্রেগসথ ক্রোন দ্বারা পরিবেশে অন্তর্ভুক্ত পরিবর্তনশীলগুলি সনাক্ত করে। আপনি কমান্ড লাইনে সেই পরিবর্তনকগুলি অন্তর্ভুক্ত করতে পারেন।
v

4
@ ড্রাগনফ্যাক্স @ ডিম্বা আমি ব্যবহার করি env - HOME="$HOME" LOGNAME="$USER" PATH="/usr/bin:/bin" SHELL="$(which sh)" command argumentsযা মনে হয় কৌশলটি করতে পারে
l0b0

"প্রতিকূল" বা অজানা পরিবেশে স্ক্রিপ্টগুলি পরীক্ষা করার জন্য এটি দুর্দান্ত একটি সহজ পদ্ধতি। যদি আপনি যথেষ্ট পরিমাণে স্পষ্ট হন যে এটি এতে চালাবে তবে এটি ক্রোন এর অধীনে চলবে।
অলি


13

ছয় বছর পরে উত্তর দেওয়া: systemd"ক্রম প্রতিস্থাপন হিসাবে" টাইমারদের " সমাধান করা সমস্যাগুলির মধ্যে একটি পরিবেশগত মিল নয় problem আপনি সিএলআই থেকে সিস্টেমড "পরিষেবা" চালনা করুন বা ক্রোনের মাধ্যমে, পরিবেশের অমিল সমস্যাটি এড়ানো এটিকে ঠিক একই পরিবেশ পাওয়া যায়।

ক্রোন জবগুলি ম্যানুয়ালি পাস করার সময় ব্যর্থ হওয়ার সবচেয়ে সাধারণ সমস্যা হ'ল $PATHক্রোন দ্বারা সীমাবদ্ধ ডিফল্ট সেট, যা এটি উবুন্টু 16.04 এ রয়েছে:

"/usr/bin:/bin"

বিপরীতে, উবুন্টু 16.04 এ $PATHসেট করা ডিফল্টটি systemdহ'ল:

"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

সুতরাং ইতিমধ্যে আরও একটি ভাল সম্ভাবনা রয়েছে যে কোনও সিস্টেমড টাইমার আরও ঝামেলা ছাড়াই বাইনারি আবিষ্কার করতে চলেছে।

সিস্টেমযুক্ত টাইমারগুলির সাথে নেতিবাচক দিকটি হ'ল এগুলি সেট আপ করার জন্য আরও কিছুটা সময় আছে। আপনি প্রথমে কী চালাতে চান তা নির্ধারণ করার জন্য একটি "পরিষেবা" ফাইল এবং এটি চালানোর সময়সূচী নির্ধারণ করার জন্য একটি "টাইমার" ফাইল তৈরি করবেন এবং শেষ পর্যন্ত এটি সক্রিয় করতে টাইমারকে "সক্ষম" করুন।


10

একটি ক্রোন জব তৈরি করুন যা এনভিভি চালায় এবং স্টাডআউটকে কোনও ফাইলে পুনঃনির্দেশ করে। ক্রোন জব হিসাবে একই পরিবেশ তৈরি করতে "env -" পাশাপাশি ফাইলটি ব্যবহার করুন।


দুঃখিত এটি আমাকে বিভ্রান্ত করেছে। "এনভি - স্ক্রিপ্ট" যথেষ্ট নয়?
জর্জে ভার্গাস 21

এটি আপনাকে একটি খালি পরিবেশ দেবে। আপনি যখন ক্রোনটির মাধ্যমে স্ক্রিপ্টগুলি চালান, পরিবেশটি খালি নয়।
জেনস কার্লবার্গ

3

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

http://libslack.org/daemon/


2

ডিফল্টরূপে, cronআপনার সিস্টেমের ধারণা যা shহয় তা ব্যবহার করে এর কাজগুলি কার্যকর করে । প্রকৃত বোর্ন শেল হতে পারে বা dash, ash, kshবা bash(অথবা অন্য এক) সিমলিঙ্ক sh(এবং POSIX মোডে চলমান ফলে)।

করণীয় হ'ল সর্বোত্তম কাজটি হ'ল আপনার স্ক্রিপ্টগুলির যা প্রয়োজন তা নিশ্চিত করা এবং তাদের জন্য কিছুই সরবরাহ করা হয়নি তা ধরে নেওয়া। অতএব, আপনার সম্পূর্ণ ডিরেক্টরি স্পেসিফিকেশন ব্যবহার করা উচিত এবং $PATHনিজের মতো পরিবেশের ভেরিয়েবলগুলি সেট করা উচিত।


এটি ঠিক আমি সমাধান করার চেষ্টা করছি। স্ক্রিপ্টগুলির সাথে আমরা প্রচুর সমস্যা পেয়েছি যা ভুল করে কিছু অনুমান করে। পুরো পাথগুলি করা এবং এনভির ভেরিয়েবলগুলি সেট করা এবং সমস্ত আবর্জনা শেষ হয়ে যায় ভয়ঙ্কর বিশাল অবিস্মরণীয় ক্রোন লাইনগুলির সাথে
জর্জে ভার্গাস

পুনরায় দুঃখিত আমি বাশ = শেল নিয়ে বড় হয়েছি তাই বিকল্প (এবং কখনও কখনও ভাল) শেল মনে রাখা আমার পক্ষে কঠিন।
জোর্জে ভার্গাস

1
@ জর্জি: ক্রোন্টাবের রেখাগুলি মোটামুটি ছোট হওয়া উচিত। স্ক্রিপ্টের মধ্যে আপনার প্রয়োজন সমস্ত সেটআপ করা উচিত (বা একটি র‍্যাপার স্ক্রিপ্ট)। উদাহরণস্বরূপ একটি ক্রন্টাব থেকে একটি সাধারণ লাইন এখানে: 0 0 * * 1 /path/to/executable >/dev/null 2>&1এবং তারপরে, "এক্সিকিউটেবল" এর মধ্যে আমি $PATHইত্যাদির জন্য মান নির্ধারণ করতাম এবং ইনপুট এবং আউটপুট ফাইল ইত্যাদিতে সম্পূর্ণ ডিরেক্টরি স্পেস ব্যবহার করতাম উদাহরণস্বরূপ:/path/to/do_something /another/path/input_file /another/path/to/output_file
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছিল।

1

আমি খুঁজে পেয়েছি এমন আরও একটি সহজ উপায় (তবে ত্রুটির প্রবণ হতে পারে, আমি এখনও পরীক্ষা করছি) হ'ল আপনার আদেশের আগে আপনার ব্যবহারকারীর প্রোফাইল ফাইলগুলি উত্স করা।

একটি /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

1

গৃহীত উত্তর পরিবেশ ক্রোন ব্যবহার করে একটি স্ক্রিপ্ট চালানোর উপায় দেয়। অন্যরা যেমন উল্লেখ করেছে, ক্রোন জবগুলি ডিবাগ করার জন্য এটি কেবলমাত্র প্রয়োজনীয় মানদণ্ড নয়।

প্রকৃতপক্ষে ক্রোন কোনও সংযুক্ত ইনপুট ব্যতীত একটি অ-ইন্টারেক্টিভ টার্মিনালও ব্যবহার করে

যদি এটি সহায়তা করে তবে আমি একটি স্ক্রিপ্ট লিখেছি যা ক্রোন দ্বারা চালিত হবে এমনভাবে একটি কমান্ড / স্ক্রিপ্টকে বেদনাদায়কভাবে চালানো সক্ষম করে। এটি প্রথম আর্গুমেন্ট হিসাবে আপনার কমান্ড / স্ক্রিপ্ট দিয়ে চাওয়া এবং আপনি ভাল।

এই স্ক্রিপ্টটি গিথুব-এ হোস্ট করা হয়েছে (এবং সম্ভবত আপডেট করা হয়েছে) ।

#!/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"

0

উত্তর https://stackoverflow.com/a/2546509/5593430 কীভাবে ক্রোন পরিবেশ পাবেন এবং এটি আপনার স্ক্রিপ্টের জন্য ব্যবহার করবেন তা দেখায়। তবে সচেতন হন যে আপনার ব্যবহৃত ক্রন্টব ফাইলের উপর নির্ভর করে পরিবেশটি পৃথক হতে পারে। এর মাধ্যমে পরিবেশ বাঁচাতে আমি তিনটি আলাদা ক্রোন এন্ট্রি তৈরি করেছি env > log। এগুলি একটি অ্যামাজন লিনাক্স 4.4.35-33.55.amzn1.x86_64 এ ফলাফল।

1. গ্লোবাল / ইত্যাদি / রুট ব্যবহারকারীর সাথে ক্রন্টব্যাক

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

3. /etc/cron.hourly/ এ স্ক্রিপ্ট

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পৃথক। একটি স্থিতিশীল পরিবেশের উপর নির্ভর করতে আপনার ক্রোন স্ক্রিপ্টগুলিতে সেট করার বিষয়টি নিশ্চিত করুন।


-8

আমি বিশ্বাস করি না যে আছে; ক্রোন জব পরীক্ষা করার একমাত্র উপায়টি হ'ল ভবিষ্যতে এক বা দুই মিনিট চালানোর জন্য এটি সেট আপ করা এবং তারপরে অপেক্ষা করুন।


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