iT邦幫忙

0

有關使用 PHP 網頁 執行 Linux crontab 排程的問題

**大家好,

小弟的網頁檔名為 add_job.php
裡面的程式碼如下如下:
<?php
$output = shell_exec('sudo crontab -u pi -l');
$job = '*/1 * * * * /usr/bin/php5 /home/pi/Downloads/job.php'. PHP_EOL;

file_put_contents('/var/www/crontab.txt', $output. $job);

exec('sudo crontab -u pi /var/www/crontab.txt');

echo 'crontab_jobs: '. shell_exec('sudo crontab -u pi -l'). '<br />';
?>

程式碼中出現的 pi 是小弟的作業系統 Raspbian 的預設帳號,
sudo 則是用來在 Raspbian 中,暫時化身 root 的權限執行 command

小弟的想法是:
先利用 sudo crontab -u pi -l 取得帳號 pi 現有的排程任務放到 $output,
然後 把我要新增的排程 $job 接在 $output 後面,寫入 /var/www/crontab.txt 中,
再執行 sudo crontab -u pi /var/www/crontab.txt
讓 crontab 為帳號 pi 新增 /var/www/crontab.txt 中的排程,
最後用 echo 'crontab_jobs: '. shell_exec('sudo crontab -u pi -l'). '<br />';
在網頁上輸出 目前的 排程 來確認 。
(其中/var/www 是我用來放置網頁的目錄,crontab.txt 和 add_job.php 都在這個目錄底下)

目前小弟遇到的問題是:
用瀏覽器觸發 add_job.php 後,
$job 有寫入 /var/www/crontab.txt,
但是,$output 是 ""(空的,
exec('sudo crontab -u pi /var/www/crontab.txt');
上面這句也沒有正常執行 (因為我在 cmd 中輸入 sudo crontab -u pi -l之後,
系統回應 no crontab for pi )

echo 'crontab_jobs: '. shell_exec('sudo crontab -u pi -l'). '<br />';
只有顯示 crontab_jobs:
表示 shell_exec('sudo crontab -u pi -l') 也沒有正常執行

但是當我直接在 cmd 中,輸入
sudo crontab -u pi -l
sudo crontab -u pi /var/www/crontab.txt
卻能夠順利的為帳號 pi 排程以及列出 pi 目前的排程

麻煩各位版友為小弟指點迷津,

感激不盡!!!**

從web去改linux的排程,
第一次聽到這樣的作法。
我通常是用crontab 去跑 script,
而不是用 script 去改 crontab。

如果是希望從web去定時跑指定的工作,
可試試看:php-resque-scheduler
resque是以redis為基礎的message Queue,
resque-scheduler 則可指定時間執行工作,
利用 resque 來執行php的工作,
也許對你是更好的選擇。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
wonton
iT邦高手 6 級 ‧ 2016-04-29 10:43:23

執行 php script 的身分 (通常為 apache) 可以 sudo 嗎?
如果你的 php 程式在 /usr/bin 底下,你可以先在 add_job.php 前面加上

&lt;pre class="c" name="code">#!/usr/bin/php -q
&lt;?php
...
?>

然後在 console 底下執行 /usr/bin/php add_job.php 看看有沒有正常執行,確定程式沒有錯誤後,再去思考 apache 是否有權限可以 sudo,只是可以的話,非常不安全...

1
wiseguy
iT邦超人 1 級 ‧ 2016-05-01 00:52:47

你犯了幾個認知錯誤:

  1. 你透過 web 去連 php,執行 php 的是 web runner,不是你(pi)。
  2. sudo 若沒有設定 pi 可以免密碼執行 crontab (應該是設定 web runner 才對),那 sudo crontab 命令會等輸入密碼等到 php timeout (預設 30 秒),你這程式完全不可能有成功執行的機會。
  3. web runner 的環境,不見得知道 crontab 在哪?所以要執行 crontab 必須用絕對路徑,例如:/usr/bin/crontab。

所以要設定成功,必須:

  1. sudo 設定 web runner 可以免密碼以 root 身份執行 crontab。以 visudo 命令編輯 sudoers 加入下列一行:
    apache ALL=NOPASSWD: /usr/bin/crontab -u pi *
    (以上假設你的 web runner 是 apache,若是 nginx 則改 nginx)
  2. php 中把命令改為 '/usr/bin/sudo /usr/bin/crontab -u pi ........,指令都用絕對位置。

這樣就行了。

0
混水摸魚
iT邦研究生 2 級 ‧ 2016-07-06 16:39:08

安裝 curl 來執行php

crontab -e 不一定要最高權限才可以設排程

你可以固定時間去跑某支php程式,再透過資料庫或是文字檔去改變某個值來設定你目前要另外觸發的排程

請參考以下連結
https://www.webteach.tw/?p=33

我要發表回答

立即登入回答