2011-07-01 29 views
11

Nếu tôi gõ crontab -l trong dòng lệnh tôi có thể thấy dòng sau:Làm thế nào để bắt đầu/dừng một cronjob bằng cách sử dụng PHP?

# * * * * * /usr/bin/php /home/user/every_minute_script.php 

Để bắt đầu cronjob này, tôi cần phải chỉnh sửa các tập tin sử dụng crontab -e lệnh, xóa ký tự bình luận vào đầu dòng, lưu tệp đã chỉnh sửa và thoát khỏi trình chỉnh sửa.

Để dừng cronjob này, các bước tương tự, nhưng thêm ký tự nhận xét ở đầu dòng.

Tôi muốn đạt được chính xác cùng một hiệu ứng bằng cách sử dụng tập lệnh PHP , thay vì chỉnh sửa thủ công tệp.

+0

Lưu ý: bạn không bắt đầu/dừng công việc (sửa đổi của bạn không ảnh hưởng đến các công việc đang chạy), bạn chỉ cần thiết lập cho dù nó sẽ bắt đầu thời gian tới hay không. – Piskvor

+0

Có. Có lẽ có một cách tốt hơn để viết câu hỏi này. Thay vì bắt đầu/dừng, có thể kích hoạt/hủy kích hoạt? –

+0

hình thức này giống như một bản sao của http://stackoverflow.com/questions/4421020/use-php-to-create-edit-and-delete-crontab-jobs – ben

Trả lời

10

tôi đã làm một số nghiên cứu và found in a forum, được thông báo sau:

Call "crontab -e" với các biến môi trường EDITOR thiết lập để một php kịch bản. Tập lệnh đó có thể sửa đổi tệp và khi nó thoát crontab sẽ đọc lại tệp và cập nhật.

Vì vậy, tôi đã thử một số thứ và hoạt động.Tôi sẽ dán mã làm việc dưới đây:

#!/usr/bin/php 
<?php 

$on = "* * * * * /usr/bin/php /home/user/every_minute_script.php\n"; 
$off = "# * * * * * /usr/bin/php /home/user/every_minute_script.php\n"; 

$param = isset($argv[1]) ? $argv[1] : ''; 
$filename = isset($argv[2]) ? $argv[2] : ''; 

if ($param == 'activate') 
{ 
    shell_exec('export EDITOR="/home/user/cron.php on"; crontab -e'); 
} 
elseif($param == 'deactivate') 
{ 
    shell_exec('export EDITOR="/home/user/cron.php off"; crontab -e'); 
} 
elseif(in_array($param, array('on', 'off'))) 
{ 
    if (!is_writable($filename)) 
     exit(); 

    $crontab = file($filename); 
    $key = array_search($param == 'on' ? $off : $on, $crontab); 

    if ($key === false) 
     exit(); 

    $crontab[$key] = $param == 'on' ? $on : $off; 
    sleep(1); 
    file_put_contents($filename, implode('', $crontab)); 
} 

exit(); 

?> 

Vì nó là, chúng tôi có một kịch bản duy nhất có tên cron.php tọa lạc tại /home/user thư mục, thiết lập để được thực thi (chmod a+x cron.php) và gọi từ dòng lệnh (PHP-CLI) . Sau đó tôi sẽ tinh chỉnh nó để chạy từ web, đó là ý định của tôi.

Cách sử dụng: ./cron.php activate để bật cronjob và ./cron.php deactivate để tắt tính năng này.

Tập lệnh đặt biến môi trường EDITOR (chính nó) và sau đó gọi crontab -e, lần lượt gọi EDITOR (hiện là cùng một tập lệnh cron.php) chuyển vị trí tệp crontab tạm thời làm đối số. Sau đó, dòng crontab thích hợp được tìm thấy và thay đổi, và phiên bản sửa đổi được lưu, thay thế tệp tạm thời. Khi tập lệnh thoát, crontab sẽ cập nhật.

Điều này thực hiện chính xác những gì tôi muốn và phù hợp với nhu cầu của tôi.

Các câu trả lời khác là tốt đẹp và có thể phù hợp với các nhu cầu và kịch bản khác nhau và tôi muốn cảm ơn tất cả những người đã đóng góp.

+0

khi tôi thực hiện ./cron.php kích hoạt tôi đang nhận '? Php: Không có tập tin hoặc thư mục' lỗi – Hunt

+0

@Hunt: đảm bảo bạn đang sử dụng các đường dẫn hợp lệ và tên tệp ... bạn cần phải thay đổi'/home/user 'cho một đường dẫn tồn tại –

2

Đặt dừng/bắt đầu tình trạng lúc bắt đầu every_minute_script.php

if($condition == false) { 
    exit(); 
} 
+0

Âm thanh tốt, và tôi nghĩ về nó. Vấn đề là tôi cần đầu ra của cronjob được gửi cho tôi (không thể sử dụng/dev/null). Và trong thiết lập của tôi, ngay cả với một "lối ra" ở đầu của kịch bản PHP, tôi sẽ nhận được một email (mỗi phút!) ... –

+0

@J. Bruni: Những gì chúng tôi đã làm là sử dụng một trình bao bọc: '* * * * * /x/y/z/blah.sh &>/dev/null'; và blah.sh là một kịch bản chạy công việc thực tế, có đầu ra của nó, và gửi đi, trừ khi không có đầu ra. – Piskvor

+0

@J. Bruni - Tôi nghĩ rằng chỉ có một email nếu có đầu ra từ kịch bản? –

2

bạn có thể đặt một số loại logic vào đầu every_minute_script.php để kiểm tra một lá cờ để xem nếu nó nên làm gì? Bằng cách đó nó có thể quay lên và sau đó nhanh chóng dừng lại nếu không có việc gì để làm.

Hoặc điều đó có quá không hiệu quả cho mục đích của bạn không?

+0

Tôi chỉ nhận xét câu trả lời của adam (tương tự như của bạn). Ý tưởng này là tốt đẹp, và có lẽ câu trả lời cuối cùng cho rất nhiều kịch bản. Trong trường hợp của tôi, nếu có thể, tôi không muốn chạy 'every_minute_script.php'. –

+0

Bạn có thể làm điều gì đó dọc theo dòng của những gì @Piskvor đang đề xuất và chỉ gửi email khi tập lệnh thực sự chạy và tạo đầu ra không? –

6

Here's hướng dẫn khá thú vị để tạo chính xác loại chức năng này bằng PHP.

7

Thay vì rối tung programatically với crontab (đó là tinh tế và dễ nổi nóng), tôi muốn đề nghị thực hiện một kiểm tra bên trong every_minute_script.php của bạn:

if (!file_exists('/your/path/run_every_minute_script')) { 
    exit; 
} 

Bằng cách này, kịch bản vẫn sẽ bắt đầu mỗi phút , nhưng nếu điều kiện không được đáp ứng (/your/path/run_every_minute_script không tồn tại), nó sẽ chấm dứt ngay lập tức mà không cần xử lý thêm.

(Tất nhiên, bạn có thể thay thế điều kiện khác nhau ở đó, ví dụ như kiểm tra các cơ sở dữ liệu cho phép, vv)


Nếu bạn cần đầu ra gửi, bạn có thể sử dụng một kịch bản wrapper. Crontab:

* * * * * /your/path/wrapper.sh > /dev/null 2> /dev/null 

Các kịch bản wrapper sau đó chạy các công việc thích hợp, thu thập đầu ra và các lỗi của nó, và nếu những người không có sản phẩm nào, mail chúng ra (lưu ý rằng bạn cũng có thể thực hiện việc kiểm tra bên trong kịch bản wrapper; chúng tôi không, vì nó dựa vào cơ sở dữ liệu).

+0

Tôi thích giải pháp này. Thanh lịch hơn nhiều so với rối tung với crontab. – jahackbeth

Các vấn đề liên quan