使用php添加定時任務

1.  php執行外部命令的函數:
       system(),exec(),passthru()
 
   注意點:
     一、調用的路徑,相對路徑有時候不是很靠譜。
           system("/bin/bash ./start-instance.sh",$status);  

    二、被調用的腳本有沒有執行權限。php

          system("sudo chmod 777  ./start-instance.sh ") 
    三、被調用的腳本能不能及時return,由於默認狀況下php的頁面只有30sec的執行週期。
           把shell扔給後臺,並且把輸出重定向到空設備。

          exec("/**/**.sh > /dev/null 2>&1 &"); html

 

示例 linux

程序代碼: php添加定時atweb

<?php shell

$str = "#!/bin/bash\n";
$str .= "echo 'king' >/home/apache.log\n";
$str .= "/bin/ls >>/home/apache.log \n";
file_put_contents("/var/www/html/fantasia/server/atq", $str);數據庫

$re = system("sudo at -f /var/www/html/fantasia/server/atq now + 1 minute 2>&1", $res);
var_dump($res);
var_dump($re);apache

?>ubuntu

注意:數組

       sudo:  當用戶權限不足是,可使用sudo進行操做     配置過程: 附1 安全

       2>&1: 錯誤重定向  不論是正確仍是錯誤,都將輸出結果信息。

       at命令:   at命令的使用格式     

 


 配置sudo過程當中的問題:

chmod 755 /etc/sudoers
#chmod 044 /etc/sudoers
vi /etc/sudoers  
 
1. 註釋Defaults requiretty
Defaults requiretty修改成 #Defaults requiretty 表示不須要控制終端。
不然會出現sudo: sorry, you must have a tty to run sudo

2. 增長行  Defaults visiblepw
不然會出現 sudo: no tty present and no askpass program specified
 
3. 新增apache 的用戶爲沒有密碼
apache       ALL=(ALL)      NOPASSWD: ALL
不然: [sudopassword for apache: 

 

4.  重啓Apache

    是用戶apache得到權限

 

5 用useradd命令添加賬號apache,提示「user apache exists" ,

可是 在root下用 su apache時,

提示This account is currently not available

usermod -s /bin/bash  apache

 

 

後記:shell執行php

命令行執行帶參數的php腳本,並取得參數

一,爲何咱們要在命令行下運行php腳本呢?

我的理解,主要有二個緣由:

1,利用crontab去跑php,能夠給服務器減壓,固然在這裏有一個條件,就是實時性要求不高。好比:sns中的好友動態,這個實時要求不高,可是數據量比較大,這個時候定時跑的話,會給web服務器,數據庫服務器分擔不小的壓力。

2,就是咱們要定時去完成某一事情,好比:我要刪除一個月前,用戶留言,這個時候,寫的php腳本在crontab去執行,一天跑一次就好了。而不是手動去執行php程序。

二,命令行下執行帶參數php,並取得參數

有一點很重要,就是命令行下執行php,是不走apache等這類東西的,沒有什麼http協議,全部get,post傳參數根本不起做用,而且還會報錯,以下:

zhangying@ubuntu:~$ php test.php?aaa=bbb

Could not open input file: test.php?aaa=bbb

般狀況下,不須要向定時跑的php腳本傳參數,但有的時候,是要的。

1,test.php測試文件,很簡單吧

  1. <?php  
  2. print_r($argv);  
  3. echo "\n";  
  4. echo $argc;  
  5. echo "\n";  
  6. ?>  

2,命令行下調用

  1. zhangying@ubuntu:~$ php test.php aaa ccc  bbbb  
  2. Array  
  3. (  
  4.  [0] => test.php    //參數0,文件自己  
  5.  [1] => aaa         //參數1  
  6.  [2] => ccc         //參數2  
  7.  [3] => bbbb        //參數3  
  8. )  
  9.   
  10. 4      //$argc的值,參數的總數  

這種傳參的方式,根shell腳本真的很像,

zhangying@ubuntu:~$ sh c1.sh aaa bbb

我向c1.sh傳了二個參數aaa bbb,shell會獲得三個參數,$0爲文件自己,$1爲參數1,$2爲參數2。不一樣的是,php獲得的是以數組的形勢,而shell不是。

 

 



附件1  sudo配置

一. 使用 su 命令臨時切換用戶身份

    一、su 的適用條件和威力

  su命令就是切換用戶的工具,怎麼理解呢?好比咱們以普通用戶beinan登陸的,但要添加用戶任務,執行useradd ,beinan用戶沒有這個權限,而這個權限偏偏由root所擁有。解決辦法沒法有兩個,一是退出beinan用戶,從新以root用戶登陸,但這種辦法並非最好的;二是咱們沒有必要退出beinan用戶,能夠用su來切換到root下進行添加用戶的工做,等任務完成後再退出root。咱們能夠看到固然經過su 切換是一種比較好的辦法;

  經過su能夠在用戶之間切換,若是超級權限用戶root向普通或虛擬用戶切換不須要密碼,什麼是權力?這就是!而普通用戶切換到其它任何用戶都須要密碼驗證;

  二、su 的用法:

  su [OPTION選項參數] [用戶]

  -, -l, ——login 登陸並改變到所切換的用戶環境;

  -c, ——commmand=COMMAND 執行一個命令,而後退出所切換到的用戶環境;

  至於更詳細的,請參看man su ;

  三、su 的範例:

  su 在不加任何參數,默認爲切換到root用戶,但沒有轉到root用戶家目錄下,也就是說這時雖然是切換爲root用戶了,但並無改變root登陸環境;用戶默認的登陸環境,能夠在/etc/passwd 中查獲得,包括家目錄,SHELL定義等;

  [beinan@localhost ~]?$ suPassword:[root@localhost beinan]# pwd/home/beinan

  su 加參數 - ,表示默認切換到root用戶,而且改變到root用戶的環境;

  [beinan@localhost ~]?$ pwd/home/beinan[beinan@localhost ~]?$ su -Password:[root@localhost ~]# pwd/root

  su 參數 - 用戶名

  [beinan@localhost ~]?$ su - root 注:這個和su - 是同樣的功能;

  Password:

  [root@localhost ~]# pwd

  /root

  [beinan@localhost ~]?$ su - linuxsir 注:這是切換到 linuxsir用戶

  Password: 注:在這裏輸入密碼;

  [linuxsir@localhost ~]?$ pwd 注:查看用戶當前所處的位置;

  /home/linuxsir

  [linuxsir@localhost ~]?$ id 注:查看用戶的UID和GID信息,主要是看是否切換過來了;

  uid=505(linuxsir) gid=502(linuxsir) groups=0(root),500(beinan),502(linuxsir)

  [linuxsir@localhost ~]?$

  [beinan@localhost ~]?$ su - -c ls 注:這是su的參數組合,表示切換到root用戶,而且改變到root環境,而後列出root家目錄的文件,而後退出root用戶;

  Password: 注:在這裏輸入root的密碼;

  anaconda-ks.cfg Desktop install.log install.log.syslog testgroup testgroupbeinan testgrouproot

  [beinan@localhost ~]?$ pwd 注:查看當前用戶所處的位置;

  /home/beinan

  [beinan@localhost ~]?$ id 注:查看當前用戶信息;

  uid=500(beinan) gid=500(beinan) groups=500(beinan)

  四、su的優缺點;

  su 的確爲管理帶來方便,經過切換到root下,能完成全部系統管理工具,只要把root的密碼交給任何一個普通用戶,他都能切換到root來完成全部的系統管理工做;但經過su切換到root後,也有不安全因素;好比系統有10個用戶,並且都參與管理。若是這10個用戶都涉及到超級權限的運用,作爲管理員若是想讓其它用戶經過su來切換到超級權限的root,必須把root權限密碼都告訴這10個用戶;若是這10個用戶都有root權限,經過root權限能夠作任何事,這在必定程度上就對系統的安全形成了威協;想一想Windows吧,簡直就是惡夢;「沒有不安全的系統,只有不安全的人」,咱們絕對不能保證這 10個用戶都能按正常操做流程來管理系統,其中任何一人對系統操做的重大失誤,均可能致使系統崩潰或數據損失;因此su 工具在多人蔘與的系統管理中,並非最好的選擇,su只適用於一兩我的參與管理的系統,畢竟su並不能讓普通用戶受限的使用;超級用戶root密碼應該掌握在少數用戶手中,這絕對是真理!因此集權而治的存在仍是有必定道理的;

二. sudo 受權許可以使用的su,也是受限制的su

  1. sudo 的適用條件

  因爲su 對切換到超級權限用戶root後,權限的無限制性,因此su並不能擔任多個管理員所管理的系統。若是用su 來切換到超級用戶來管理系統,也不能明確哪些工做是由哪一個管理員進行的操做。特別是對於服務器的管理有多人蔘與管理時,最好是針對每一個管理員的技術特長和管理範圍,而且有針對性的下放給權限,而且約定其使用哪些工具來完成與其相關的工做,這時咱們就有必要用到 sudo。

  經過sudo,咱們能把某些超級權限有針對性的下放,而且不須要普通用戶知道root密碼,因此sudo 相對於權限無限制性的su來講,仍是比較安全的,因此sudo 也能被稱爲受限制的su ;另外sudo 是須要受權許可的,因此也被稱爲受權許可的su;

  sudo 執行命令的流程是當前用戶切換到root(或其它指定切換到的用戶),而後以root(或其它指定的切換到的用戶)身份執行命令,執行完成後,直接退回到當前用戶;而這些的前提是要經過sudo的配置文件/etc/sudoers來進行受權;

好比咱們想用beinan普通用戶經過more /etc/shadow文件的內容時,可能會出現下面的狀況;

  [beinan@localhost ~]?$ more /etc/shadow/etc/shadow: 權限不夠

  這時咱們能夠用sudo more /etc/shadow 來讀取文件的內容;就就須要在/etc/soduers中給beinan受權

  因而咱們就能夠先su 到root用戶下經過visudo 來改/etc/sudoers ;(好比咱們是以beinan用戶登陸系統的)

  [beinan@localhost ~]?$ su

  Password: 注:在這裏輸入root密碼

  下面運行visodu;

  [root@localhost beinan]# visudo 注:運行visudo 來改 /etc/sudoers

  加入以下一行,退出保存;退出保存,在這裏要會用vi,visudo也是用的vi編輯器;至於vi的用法很少說了;beinan ALL=/bin/more 表示beinan能夠切換到root下執行more 來查看文件;

  退回到beinan用戶下,用exit命令;

  [root@localhost beinan]# exit

  exit

  [beinan@localhost ~]?$

  查看beinan的經過sudo能執行哪些命令?

  [beinan@localhost ~]?$ sudo -l

  Password: 注:在這裏輸入beinan用戶的密碼

  User beinan may run the following commands on this host: 注:在這裏清晰的說明在本臺主機上,beinan用戶能夠以root權限運行more ;在root權限下的more ,能夠查看任何文本文件的內容的;

  (root) /bin/more

  最後,咱們看看是否是beinan用戶有能力看到/etc/shadow文件的內容;

  [beinan@localhost ~]?$ sudo more /etc/shadow

  beinan 不但能看到 /etc/shadow文件的內容,還能看到只有root權限下才能看到的其它文件的內容,好比;

  [beinan@localhost ~]?$ sudo more /etc/gshadow

  對於beinan用戶查看和讀取全部系統文件中,我只想把/etc/shadow 的內容可讓他查看;能夠加入下面的一行;

  beinan ALL=/bin/more /etc/shadow

  題外話:有的弟兄會說,我經過su 切換到root用戶就能看到全部想看的內容了,哈哈,對啊。但我們如今不是在講述sudo的用法嗎?若是主機上有多個用戶而且不知道root用戶的密碼,但又想查看某些他們看不到的文件,這時就須要管理員受權了;這就是sudo的好處;

  實例五:練習用戶組在/etc/sudoers中寫法;

  若是用戶組出如今/etc/sudoers 中,前面要加%號,好比%beinan ,中間不能有空格;%beinan ALL=/usr/sbin/*,/sbin/*

  若是咱們在 /etc/sudoers 中加上如上一行,表示beinan用戶組下的全部成員,在全部可能的出現的主機名下,都能切換到root用戶下運行 /usr/sbin和/sbin目錄下的全部命令;

  實例六:練習取消某類程序的執行:

  取消程序某類程序的執行,要在命令動做前面加上!號; 在本例中也出現了通配符的*的用法;

  beinan ALL=/usr/sbin/*,/sbin/*,!/usr/sbin/fdisk 注:把這行規則加入到/etc/sudoers中;但您得有beinan這個用戶組,而且beinan也是這個組中的才行;

  本規則表示beinan用戶在全部可能存在的主機名的主機上運行/usr/sbin和/sbin下全部的程序,但fdisk 程序除外;

  [beinan@localhost ~]?$ sudo -l

  Password: 注:在這裏輸入beinan用戶的密碼;

  User beinan may run the following commands on this host:(root) /usr/sbin/*(root) /sbin/*(root) !/sbin/fdisk[beinan@localhost ~]?$ sudo /sbin/fdisk -lSorry, user beinan is not allowed to execute '/sbin/fdisk -l' as root on localhost.

  注:不能切換到root用戶下運行fdisk 程序;

若是有sudo 的權限而沒有su的權限: sudo su;

相關文章
相關標籤/搜索