প্রশ্ন নিজে এবং অবিলম্বে একটি cron কাজ চলমান


(আমি ইতিমধ্যে পড়া আছে কিভাবে আমি একটি নতুন ক্রন স্ক্রিপ্ট পরীক্ষা করতে পারেন?।)

আমার একটি নির্দিষ্ট সমস্যা আছে (ক্রন কাজ চালানো বা সঠিকভাবে চালানো হয় না), তবে সমস্যাটি সাধারণ: আমি স্ক্রিনগুলিকে ডিবাগ করতে চাই। আমি সচেতন যে আমি * * * * * ক্রোন্ট্যাব লাইন সেট আপ করতে পারি, কিন্তু এটি সম্পূর্ণরূপে সন্তোষজনক সমাধান নয়। ক্রমনটি চালানোর সময় আমি ক্রমান্বয়ে ক্রমান্বয়ে একটি ক্রন কাজ চালাতে সক্ষম হব (একই ব্যবহারকারী, একই পরিবেশ ভেরিয়েবল ইত্যাদি)। এই কাজ করতে একটি উপায় আছে কি? স্ক্রিপ্ট পরিবর্তন পরীক্ষা 60 সেকেন্ড অপেক্ষা করার জন্য ব্যবহারিক নয়।


94
2017-11-18 13:55


উত্স


(দুঃখিত মন্তব্য যোগ করতে পারেন না) 0 30 16 20 *? * এমনকি আপনি যদি এমন কাজটি চালান, তবে পুরো ধারণাটি স্ক্রিপ্ট আউটপুট প্রদান করা হয় কি না সেটি ভুল না হওয়া পর্যন্ত এটি একটি লগে লিখতে না পারলে, এটি quuiet নিরর্থক


উত্তর:


এখানে আমি কি করেছি, এবং এই পরিস্থিতিতে কাজ বলে মনে হচ্ছে। অন্তত, এটি আমাকে একটি ত্রুটি দেখায়, যখন কমান্ড লাইন থেকে চলমান ব্যবহারকারী হিসাবে ত্রুটিটি দেখায় না।


ধাপ 1: আমি ব্যবহারকারীর crontab মধ্যে সাময়িকভাবে এই লাইন রাখুন:

* * * * *   /usr/bin/env > /home/username/tmp/cron-env

তারপর ফাইল লেখা হয় একবার এটি গ্রহণ।

ধাপ ২: নিজেকে একটি সামান্য রান-হিসাবে-ক্রন bash স্ক্রিপ্ট গঠিত:

#!/bin/bash
/usr/bin/env -i $(cat /home/username/tmp/cron-env) "$@"

সুতরাং, ব্যবহারকারী হিসাবে প্রশ্ন, আমি সক্ষম ছিল

run-as-cron /the/problematic/script --with arguments --and parameters

এই সমাধান সম্ভবত সুডোর ব্যবহার বা আরও নমনীয়তার জন্য প্রসারিত করা যেতে পারে।

এই অন্যদের সাহায্য করে আশা করি।


73
2017-11-18 14:40



এটি আমার জন্য কাজ করে না এবং আমি আশ্চর্য যে কেউ আপত্তিকর জন্য এটা না। 1) কেন আপনি ব্যাশ ব্যবহার করছেন? এটা এখানে প্রয়োজন হয় না এবং এটি অবস্থিত হতে পারে না /usr/bin। 2) cat …/cron-env আউটপুট একাধিক লাইন, যা কাজ করে না। শুধু চালানোর চেষ্টা করুন /usr/bin/env -i $(cat cron-env) echo $PATH টার্মিনালে, এটি ব্যবহার করে পরিবর্তে পরিবেশকে আউটপুট করে। 3) বর্তমান পরিবেশ এমুলেটেড ক্রন পরিবেশে ফুটো। চেষ্টা করুন: export foo=leaked; run-as-cron echo $foo। - Marco
@ মারকো ওয়ার্কস ব্যাশে, যা আমি যা ব্যবহার করি তা হিসাবে এটি sh এর চেয়ে একটি ভাল সংজ্ঞায়িত পরিবেশ। আমি pdksh, ksh (একাধিক সংস্করণ), ব্যাশ এবং ড্যাশ থেকে সবকিছু ব্যবহার করি তাই আমি sh এর "বিশুদ্ধ" প্রয়োগগুলির মধ্যে পার্থক্য সম্পর্কে খুব সচেতন, এমনকি ভাষাগুলির সাধারণ উপসেটে খুব কঠোরভাবে থাকাকালীনও। :-) - Max Murphy
@ মারকো ২। cat আউটপুট একাধিক লাইন, যা কাজ করে, কারণ শেল প্রতিস্থাপন তাদের একক লাইনে ভেঙ্গে দেয়, যা দিয়ে আপনি পরীক্ষা করতে পারেন echo $(cat cron-env ) | wc; আপনার উদাহরণ কমান্ড, /usr/bin/env -i $(cat cron-env) echo $PATH, বিকল্প $PATH কলিং শেল থেকে; পরিবর্তে, এটি উপনিবেশে প্রতিস্থাপন করার জন্য একটি উপসাগর আহ্বান করা উচিত, উদাঃ। /usr/bin/env -i $(cat cron-env) /bin/sh -c 'echo $PATH'। 3. আপনি একই ভুল করেছেন, আবার সাবেন পরিবেশের পরিবর্তে কলিং শেলে প্রতিস্থাপন করছেন - John Freeman


আমি পিস্তো উত্তর উপর ভিত্তি করে একটি সমাধান উপস্থাপন, কিন্তু ত্রুটি ছাড়া।

  • ক্রোন্ট্যাবে নিম্নলিখিত লাইনটি যোগ করুন, উদাঃ ব্যবহার crontab -e

    * * * * *  /usr/bin/env > /home/username/cron-env
    
  • একটি শেল স্ক্রিপ্ট তৈরি করুন যা ক্রন কাজ চালানোর মতো একই পরিবেশে একটি কমান্ড চালায়:

    #!/bin/sh
    
    . "$1"
    exec /usr/bin/env -i "$SHELL" -c ". $1; $2"
    

ব্যবহার করুন:

run-as-cron <cron-environment> <command>

উদাহরণস্বরূপ

run-as-cron /home/username/cron-env 'echo $PATH'

মনে রাখবেন যে দ্বিতীয় যুক্তিটি উদ্ধৃত করতে হবে যদি এটি একটি আর্গুমেন্টের প্রয়োজন হয়। স্ক্রিপ্টের প্রথম লাইনটি দোভাষী হিসাবে একটি POSIX শেল লোড করে। দ্বিতীয় লাইন cron পরিবেশ ফাইল সূত্র। এটি সঠিক শেল লোড করতে হবে, যা পরিবেশ পরিবর্তনশীলে সংরক্ষণ করা হয় SHELL। তারপরে এটি একটি খালি পরিবেশ লোড করে (নতুন শেলের পরিবেশগত ভেরিয়েবলগুলি লিক করতে বাধা দেয়), একই শেলটি চালু করে যা ক্রনজোজগুলির জন্য ব্যবহৃত হয় এবং ক্রন পরিবেশের পরিবর্তনগুলি লোড করে। অবশেষে কমান্ড নির্বাহ করা হয়।


34
2017-09-24 18:46



এই আমাকে আমার রুবি-সংক্রান্ত স্ফিন্স লোডিং ত্রুটি পুনরুত্পাদন করতে সাহায্য করেছে। - cweiske
আমি cron-env ফাইলটি লিখতে @reboot cron বিকল্পটি ব্যবহার করেছি। তারপর আপনি crontab এ এটি ছেড়ে দিতে পারেন এবং সিস্টেমটি শুরু হওয়ার পরে এটি শুধুমাত্র পুনঃলিখন করা হবে। আপনি লাইন যোগ / অপসারণ করতে হবে না, এটা এটা একটু সহজ করে তোলে। - Michael Barton


ক্রোন্ট্যাব কাজটি না করেই, আপনি এটির সামগ্রীটি ম্যানিপুলেট করতে পারবেন:

crontab -l | grep -v '^#' | cut -f 6- -d ' ' | while read CMD; do eval $CMD; done

এর মানে কি :

  • তালিকা crontab তালিকা
  • মন্তব্য লাইন মুছে ফেলুন
  • crontab কনফিগারেশন মুছে ফেলুন
  • তারপর এক এক তাদের আরম্ভ

14
2017-08-19 19:45



ক্রোনের মতো একই পরিবেশে এটি অগত্যা করে না, যদিও আমি মনে করি সে কেবলমাত্র তাদের পরীক্ষা করতে চায়। - Falcon Momot
ঠিক আছে, আমি ভুল হয়ে গেছি ... এটা শুধু কাজ চালায় কিন্তু ক্রন চাই না! - Django Janny
এখনও একটি ভয়ঙ্কর সমাধান +1 - Eric Uldall


ডিফল্টভাবে আমি যে ডিফল্ট ক্রন ডিমনগুলি দেখেছি তা দিয়ে, এখানে ডানদিকে চালানোর ক্রোকে বলার কোন উপায় নেই। আপনি anacron ব্যবহার করছেন, এটা সম্ভব হতে পারে আমি সম্মুখভাগে একটি পৃথক উদাহরণ চালাতে মনে হতে পারে।

আপনার স্ক্রিপ্ট সঠিকভাবে চলমান না হয় তাহলে আপনি যে অ্যাকাউন্ট গ্রহণ করা হয় না

  • স্ক্রিপ্ট একটি নির্দিষ্ট ব্যবহারকারী হিসাবে চলমান হয়
  • Cron একটি বিধিনিষেধযুক্ত পরিবেশ আছে (এই সবচেয়ে স্পষ্ট প্রকাশ একটি ভিন্ন পথ)।

Crontab থেকে (5):

বিভিন্ন পরিবেশ ভেরিয়েবল সেট করা হয়   ক্রন দ্বারা স্বয়ংক্রিয়ভাবে আপ (8)   ডেমন। SHELL / bin / sh সেট করা হয়, এবং   LOGNAME এবং HOME থেকে সেট করা হয়   crontab এর / etc / passwd লাইন   মালিক বানিয়েছেন। PATH "/ usr / bin: / bin" তে সেট করা আছে।   হোম, শেল, এবং প্যাথ হতে পারে   সেটিংস দ্বারা overridden   নিম্নলিখিতরূপে crontab পরিবর্তন; LOGNAME ব্যবহারকারী যে   কাজ থেকে চলছে, এবং হতে পারে না   পরিবর্তন করেছেন।

সাধারণ PATH সবচেয়ে বড় সমস্যা, তাই আপনাকে এটি করতে হবে:

  • পরীক্ষার সময়, / usr / bin: / bin -এ স্পষ্টভাবে PATH সেট করুন। আপনি সঙ্গে bash এই কাজ করতে পারেন রপ্তানি PATH = "/ usr / bin: / bin"
  • স্পষ্টভাবে crontab শীর্ষে আপনি চান সঠিক পাথ সেট। উদাহরণস্বরূপ পাথ = ", / usr / বিন: / বিন / usr / স্থানীয় / বিন: / usr / sbin: পক্ষ থেকে / sbin"

শেল ছাড়া অন্য ব্যবহারকারী হিসাবে স্ক্রিপ্ট চালানোর প্রয়োজন হলে (উদাহরণস্বরূপ www-data), sudo ব্যবহার করুন:

sudo -u www-data /path/to/crontab-script.sh

প্রথমে এটি পরীক্ষা করার প্রথম জিনিস, অবশ্যই, আপনার স্ক্রিপ্ট আসলে কমান্ড লাইন থেকে যা করতে অনুমিত তা করে। যদি আপনি কমান্ড লাইন থেকে এটি চালাতে না পারেন তবে এটি অবশ্যই ক্রন দিয়ে কাজ করবে না।


5
2017-11-18 14:27



পুঙ্খানুপুঙ্খ প্রতিক্রিয়া জন্য আপনাকে ধন্যবাদ। আমি বিশেষ ব্যবহারকারী হিসাবে চলমান দুটি বিষয় এবং বিশেষ পরিবেশের সাথে সচেতন। যেমন, আমি নিজের উত্তর তৈরি করেছি, যা আমি এখন পোস্ট করবো ... - Pistos
পালা অক্ষর কাজ চলমান জন্য একটি বৈধ কারণ হয় - Joe Phillips


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


1
2017-11-18 14:04



অন্য কথায়, আপনি বলছেন যে এটি করার কোন উপায় নেই? শুধুমাত্র "বন্ধ যথেষ্ট" workarounds? - Pistos
না, আমি বলছি যে আপনি আমার উত্তরে প্রদত্ত তথ্যটি ব্যবহার করে এটি করতে পারেন। - womble♦


উদাহরণস্বরূপ অধিকাংশ crontabs মধ্যে vixie-cron আপনি crontab এ ভেরিয়েবলগুলি নিজের মতোই স্থাপন করতে পারেন এবং তারপরে / usr / bin / env ব্যবহার করেন কিনা তা পরীক্ষা করতে ব্যবহার করুন। রান-এ-ক্রন স্ক্রিপ্টের সাথে কী ভুল হয়েছে তা একবার খুঁজে পাওয়ার পরে আপনি আপনার স্ক্রিপ্টটিকে crontab এ কাজ করতে পারেন।

SHELL=/bin/bash
LANG=en
FASEL=BLA

* * * * *   /usr/bin/env > /home/username/cron-env

1
2017-10-27 06:52





মার্কো এর স্ক্রিপ্ট কিছু কারণে আমার জন্য কাজ করে না। আমার ডিবাগ করার সময় ছিল না, তাই আমি পাইথন স্ক্রিপ্ট লিখেছিলাম যা একই জিনিস করে। এটি দীর্ঘ, কিন্তু: প্রথমত, এটি আমার জন্য কাজ করে, এবং দ্বিতীয়ত, আমি বুঝতে সহজ বোধ করি। আপনি আপনার পরিবেশ সংরক্ষণ যেখানে "/ tmp / cron-env" পরিবর্তন করুন। এটা এখানে:

#!/usr/bin/env python
from __future__ import division, print_function

import sys
import os

def main():
    if len(sys.argv) != 2 or sys.argv[1] in ('-h', '--help'):
        print("Usage: {} CMD\n"
              "Run a command as cron would. Note that CMD must be quoted to be only one argument."
              .format(sys.argv[0]))
        sys.exit(1)
    _me, cmd = sys.argv
    env = dict(line.strip().split('=', 1) for line in open('/tmp/cron-env'))
    sh = env['SHELL']
    os.execvpe(sh, [sh, '-c', cmd], env)

if __name__ == '__main__':
    main()

1
2017-12-24 08:48