it-swarm-vi.tech

Làm thế nào để kiểm tra một công việc cron hàng tuần?

Tôi có tệp #!/bin/bash trong thư mục cron.week.

Có cách nào để kiểm tra nếu nó hoạt động? Không thể đợi 1 tuần

Tôi đang dùng Debian 6 với root

223
dynamic

Chỉ cần làm những gì cron làm, chạy như sau root:

run-parts -v /etc/cron.weekly

... hoặc cái tiếp theo nếu bạn nhận được lỗi "Không phải là thư mục: -v":

run-parts /etc/cron.weekly -v

Tùy chọn -v in tên tập lệnh trước khi chúng được chạy.

224
NNRooth

Một chút ngoài phạm vi câu hỏi của bạn ... nhưng đây là những gì tôi làm.

"Làm thế nào để tôi kiểm tra một công việc định kỳ?" câu hỏi được kết nối chặt chẽ với "làm cách nào để kiểm tra các tập lệnh chạy trong bối cảnh không tương tác được khởi chạy bởi các chương trình khác?" Trong cron, trình kích hoạt là một số điều kiện thời gian, nhưng rất nhiều cơ sở * nix khác khởi chạy các tập lệnh hoặc đoạn mã theo cách không tương tác và thường là các điều kiện trong đó các tập lệnh chạy có chứa điều gì đó bất ngờ và gây ra vỡ cho đến khi các lỗi được sắp xếp.

Một cách tiếp cận chung cho vấn đề này là hữu ích để có.

Một trong những kỹ thuật yêu thích của tôi là sử dụng một tập lệnh mà tôi đã viết có tên là ' crontest '. Nó khởi chạy lệnh đích bên trong phiên màn hình GNU từ bên trong cron, để bạn có thể gắn với một thiết bị đầu cuối riêng biệt để xem những gì đang diễn ra, tương tác với tập lệnh, thậm chí sử dụng trình gỡ lỗi.

Để thiết lập tính năng này, bạn sẽ sử dụng "tất cả các ngôi sao" trong mục nhập crontab của mình và chỉ định crontest là lệnh đầu tiên trên dòng lệnh, ví dụ:

* * * * * crontest /command/to/be/tested --param1 --param2

Vì vậy, bây giờ cron sẽ chạy lệnh của bạn mỗi phút, nhưng crontest sẽ đảm bảo rằng chỉ có một phiên bản chạy tại một thời điểm. Nếu lệnh mất thời gian để chạy, bạn có thể thực hiện "màn hình -x" để đính kèm và xem nó chạy. Nếu lệnh là một tập lệnh, bạn có thể đặt lệnh "đọc" ở trên cùng để làm cho nó dừng lại và chờ cho phần đính kèm màn hình hoàn tất (nhấn enter sau khi đính kèm)

Nếu lệnh của bạn là tập lệnh bash, bạn có thể thực hiện việc này thay thế:

* * * * * crontest --bashdb /command/to/be/tested --param1 --param2

Bây giờ, nếu bạn đính kèm với "screen -x", bạn sẽ phải đối mặt với phiên bashdb tương tác và bạn có thể bước qua mã, kiểm tra các biến, v.v.

#!/bin/bash

# crontest
# See https://github.com/Stabledog/crontest for canonical source.

# Test wrapper for cron tasks.  The suggested use is:
#
#  1. When adding your cron job, use all 5 stars to make it run every minute
#  2. Wrap the command in crontest
#        
#
#  Example:
#
#  $ crontab -e
#     * * * * * /usr/local/bin/crontest $HOME/bin/my-new-script --myparams
#
#  Now, cron will run your job every minute, but crontest will only allow one
#  instance to run at a time.  
#
#  crontest always wraps the command in "screen -d -m" if possible, so you can
#  use "screen -x" to attach and interact with the job.   
#
#  If --bashdb is used, the command line will be passed to bashdb.  Thus you
#  can attach with "screen -x" and debug the remaining command in context.
#
#  NOTES:
#   - crontest can be used in other contexts, it doesn't have to be a cron job.
#       Any place where commands are invoked without an interactive terminal and
#       may need to be debugged.
#
#   - crontest writes its own stuff to /tmp/crontest.log
#
#   - If GNU screen isn't available, neither is --bashdb
#

crontestLog=/tmp/crontest.log
lockfile=$(if [[ -d /var/lock ]]; then echo /var/lock/crontest.lock; else echo /tmp/crontest.lock; fi )
useBashdb=false
useScreen=$( if which screen &>/dev/null; then echo true; else echo false; fi )
innerArgs="[email protected]"
screenBin=$(which screen 2>/dev/null)

function errExit {
    echo "[-err-] [email protected]" | tee -a $crontestLog >&2
}

function log {
    echo "[-stat-] [email protected]" >> $crontestLog
}

function parseArgs {
    while [[ ! -z $1 ]]; do
        case $1 in
            --bashdb)
                if ! $useScreen; then
                    errExit "--bashdb invalid in crontest because GNU screen not installed"
                fi
                if ! which bashdb &>/dev/null; then
                    errExit "--bashdb invalid in crontest: no bashdb on the PATH"
                fi

                useBashdb=true
                ;;
            --)
                shift
                innerArgs="[email protected]"
                return 0
                ;;
            *)
                innerArgs="[email protected]"
                return 0
                ;;
        esac
        shift
    done
}

if [[ -z  $sourceMe ]]; then
    # Lock the lockfile (no, we do not wish to follow the standard
    # advice of wrapping this in a subshell!)
    exec 9>$lockfile
    flock -n 9 || exit 1

    # Zap any old log data:
    [[ -f $crontestLog ]] && rm -f $crontestLog

    parseArgs "[email protected]"

    log "crontest starting at $(date)"
    log "Raw command line: [email protected]"
    log "Inner args: [email protected]"
    log "screenBin: $screenBin"
    log "useBashdb: $( if $useBashdb; then echo YES; else echo no; fi )"
    log "useScreen: $( if $useScreen; then echo YES; else echo no; fi )"

    # Were building a command line.
    cmdline=""

    # If screen is available, put the task inside a pseudo-terminal
    # owned by screen.  That allows the developer to do a "screen -x" to
    # interact with the running command:
    if $useScreen; then
        cmdline="$screenBin -D -m "
    fi

    # If bashdb is installed and --bashdb is specified on the command line,
    # pass the command to bashdb.  This allows the developer to do a "screen -x" to
    # interactively debug a bash Shell script:
    if $useBashdb; then
        cmdline="$cmdline $(which bashdb) "
    fi

    # Finally, append the target command and params:
    cmdline="$cmdline $innerArgs"

    log "cmdline: $cmdline"


    # And run the whole schlock:
    $cmdline 

    res=$?

    log "Command result: $res"


    echo "[-result-] $(if [[ $res -eq 0 ]]; then echo ok; else echo fail; fi)" >> $crontestLog

    # Release the lock:
    9<&-
fi
81
Stabledog

Sau khi loay hoay với một số nội dung trong cron không tương thích ngay lập tức, tôi thấy rằng cách tiếp cận sau đây rất hay để gỡ lỗi:

crontab -e

* * * * * /path/to/prog var1 var2 &>>/tmp/cron_debug_log.log

Điều này sẽ chạy tác vụ một lần một phút và bạn chỉ cần nhìn vào tệp /tmp/cron_debug_log.log để tìm hiểu chuyện gì đang xảy ra.

Nó không chính xác là "công việc lửa" mà bạn có thể đang tìm kiếm, nhưng điều này đã giúp tôi rất nhiều khi gỡ lỗi một kịch bản không hoạt động trong cron lúc đầu.

39
Automatico

Tôi sẽ sử dụng tệp khóa và sau đó đặt công việc định kỳ để chạy mỗi phút. (sử dụng crontab -e và * * * * */path/to/job) Bằng cách đó bạn có thể tiếp tục chỉnh sửa các tệp và mỗi phút chúng sẽ được kiểm tra. Ngoài ra, bạn có thể dừng cronjob bằng cách chạm vào tệp khóa.

    #!/bin/sh
    if [ -e /tmp/cronlock ]
    then
        echo "cronjob locked"
        exit 1
    fi

    touch /tmp/cronlock
    <...do your regular cron here ....>
    rm -f /tmp/cronlock
23
dave fernholz

Điều gì về việc đưa nó vào cron.hourly, đợi cho đến lần chạy công việc định kỳ hàng giờ tiếp theo, sau đó loại bỏ nó? Điều đó sẽ chạy nó một lần trong vòng một giờ và trong môi trường định kỳ. Bạn cũng có thể chạy ./your_script, nhưng điều đó sẽ không có cùng môi trường như dưới cron.

5
Jeremiah Willcock

Ngoài ra, bạn cũng có thể sử dụng:

http://pypi.python.org/pypi/cronwrap

để kết thúc cron của bạn để gửi email cho bạn khi thành công hay thất bại.

4
Low Kian Seong

Không có câu trả lời nào phù hợp với tình huống cụ thể của tôi, đó là tôi muốn chạy một công việc định kỳ cụ thể, chỉ một lần và chạy nó ngay lập tức.

Tôi đang sử dụng máy chủ Ubuntu và tôi sử dụng cPanel để thiết lập các công việc định kỳ của mình.

Tôi chỉ đơn giản là viết ra các thiết lập hiện tại của mình, và sau đó chỉnh sửa chúng thành một phút kể từ bây giờ. Khi tôi sửa một lỗi khác, tôi chỉ cần chỉnh sửa lại một phút nữa. Và khi tôi đã hoàn tất, tôi chỉ cần đặt lại cài đặt về trạng thái trước đó.

Ví dụ: Bây giờ là 4:34 chiều, vì vậy tôi đặt 35 16 * * *, để nó chạy lúc 16:35.

Nó hoạt động như một bùa mê, và điều tôi từng chờ đợi nhất là ít hơn một phút.

Tôi nghĩ rằng đây là một lựa chọn tốt hơn so với một số câu trả lời khác bởi vì tôi không muốn chạy tất cả các crons hàng tuần của mình và tôi không muốn công việc chạy mỗi phút. Tôi phải mất vài phút để khắc phục mọi sự cố trước khi tôi sẵn sàng kiểm tra lại. Hy vọng điều này sẽ giúp được ai đó.

4
Ben C

Tôi thường kiểm tra bằng cách chạy công việc tôi đã tạo như thế này:

Nó dễ dàng hơn để sử dụng hai thiết bị đầu cuối để làm điều này.

điều hành công việc:

#./jobname.sh

đi đến:

#/var/log and run 

chạy như sau:

#tailf /var/log/cron

Điều này cho phép tôi xem cập nhật nhật ký cron trong thời gian thực. Bạn cũng có thể xem lại nhật ký sau khi bạn chạy nó, tôi thích xem trong thời gian thực.

Dưới đây là một ví dụ về một công việc cron đơn giản. Chạy bản cập nhật yum ...

#!/bin/bash
YUM=/usr/bin/yum
$YUM -y -R 120 -d 0 -e 0 update yum
$YUM -y -R 10 -e 0 -d 0 update

Đây là sự cố:

Lệnh đầu tiên sẽ tự cập nhật yum và tiếp theo sẽ áp dụng các cập nhật hệ thống.

-R 120: Đặt lượng thời gian tối đa yum sẽ đợi trước khi thực hiện lệnh

-e 0: Đặt mức lỗi thành 0 (phạm vi 0 - 10). 0 có nghĩa là chỉ in các lỗi nghiêm trọng mà bạn phải được thông báo.

-d 0: Đặt mức gỡ lỗi thành 0 - tăng hoặc giảm số lượng những thứ được in. (phạm vi: 0 - 10).

-y: Giả sử có; giả sử rằng câu trả lời cho bất kỳ câu hỏi nào sẽ được hỏi là có

Sau khi tôi xây dựng công việc định kỳ, tôi chạy lệnh bên dưới để thực hiện công việc của mình.

#chmod +x /etc/cron.daily/jobname.sh 

Hy vọng điều này sẽ giúp, Dorlack

2
Dorlack
Sudo run-parts --test /var/spool/cron/crontabs/

các tệp trong thư mục crontabs/ đó cần phải được thực thi bởi chủ sở hữu - octal 700

nguồn: man cronNNRoothNAME _ 's

2
n611x007

Giải pháp tôi đang sử dụng như sau:

  1. Chỉnh sửa crontab (sử dụng lệnh: crontab -e) để chạy công việc thường xuyên khi cần thiết (cứ sau 1 phút hoặc 5 phút)
  2. Sửa đổi tập lệnh Shell cần được thực thi bằng cron để in đầu ra thành một số tệp (ví dụ: echo "Hoạt động tốt" >>
    [.__.] output.txt)
  3. Kiểm tra tệp output.txt bằng lệnh: tail -f output.txt, phần này sẽ in các bổ sung mới nhất vào tệp này và do đó bạn có thể theo dõi việc thực thi tập lệnh
2
Abhilash