Ver Mensaje Individual
  #20 (permalink)  
Antiguo 20/01/2017, 09:03
primary
 
Fecha de Ingreso: agosto-2011
Mensajes: 306
Antigüedad: 12 años, 8 meses
Puntos: 5
Respuesta: Crear y elimi ar cron job

Cita:
Iniciado por Triby Ver Mensaje
Por favor, mantengan el buen trato entre usuarios.

fvillalba: Si no te entienden, o no te quieren entender, olvídate del tema y ahórrate un mal rato.

primary: Si ves que hay una ofensa, usa el ícono para reportar el mensaje y no respondas en la misma forma, eso no te va a ayudar a encontrar la solución a tu problema.
hola, tienes toda la razón no lo haré mas os pido mil perdones.


Volviendo al tema yo tenia la curiosidad no necesidad de aprender a gestionar tareas programadas en linux y tenia muchas dudas sobre todo en los comandos, gracias a los compañeros y leyendo un poco entendí mi curiosidad de como se hace, cree una sencilla clase para esto y es funcional porque la probé.

Primero decir que esta clase seria para gestionar las tareas desde el mismo servidor que están para eso usare la función exec(), si se quiere gestionar desde otro servidor se debería usar ssh2_exec por ejemplo y creando una clave publica encriptada, pero no quiero hablar mucho de la seguridad porque mi post no era sobre ello pero si decir que para la clase se debe usar un usuario con los permisos minimos y la función exec limitarla solo para los directorios necesarios.

no me enrollo mas y pongo la clase sirve para eliminar, crear, modificar el tiempo de la tarea y eliminar todas.

Código PHP:
Ver original
  1. <?php
  2. class ManagerTasks {
  3.     //recuperar tareas con array de salida
  4.     private function recoverTasks(){
  5.         exec("crontab -l",$output);
  6.         return $output;
  7.     }
  8.     //convertir array de las tareas a cadena
  9.     private function convertString($chores){
  10.         $str=implode("\n",$chores);
  11.         return trim($str);
  12.     }
  13.     //verificar si existe la tarea para eliminar o borrar o editar posteriormente
  14.     private function exists($chores,$serverTask){
  15.         if(in_array($serverTask,$chores)){
  16.             return true;
  17.         }
  18.         return false;
  19.     }
  20.     //crear nueva tarea
  21.     public function createTask($serverTask){
  22.         $chores=$this->recoverTasks();
  23.         $exists=$this->exists($chores,$serverTask);
  24.         if($exists===false){
  25.             $chores[]=$serverTask;
  26.             return $this->saveTasks($chores);
  27.         }
  28.         echo"error: la tarea ya existe";
  29.     }
  30.     //eliminar una tarea existente
  31.     public function deleteTask($serverTask){
  32.         $chores=$this->recoverTasks();
  33.         $exists=$this->exists($chores,$serverTask);
  34.         if($exists===true){
  35.             if(count($chores)==1){
  36.                 //al tener solo una eliminamos todas
  37.                 return $this->removeAll();
  38.             }else{
  39.                 foreach($chores as $key => $value){
  40.                     if($serverTask==$value){
  41.                         unset($chores[$key]);
  42.                         break;
  43.                     }
  44.                 }
  45.                 return $this->saveTasks($chores);
  46.             }
  47.         }
  48.         echo"error:la tarea no existe";
  49.     }
  50.     //editar el tiempo de tarea: parametros (ruta del script,tiempo actual,tiempo nuevo)
  51.     //con tiempo me refiero a cuando se ejecuta la tarea ejemplo '*/30 * * * *' cada 30min
  52.     public function editTaskTime($route,$currentTime,$newTime){
  53.         $chores=$this->recoverTasks();
  54.         foreach($chores as $key => $line){
  55.             if(stristr($line,$route)!==false){
  56.                 $new=str_replace($currentTime,$newTime,$line);
  57.                 $chores[$key]=$new;
  58.                 return $this->saveTasks($chores);
  59.             }
  60.         }
  61.     }
  62.     //guardar cambios despues de crear, editar o eliminar una tarea
  63.     private function saveTasks($chores){
  64.         $choresString=$this->convertString($chores);
  65.         exec("crontab -l | echo '$choresString' | crontab -",$output,$status);
  66.         if($status===0){
  67.             echo"correcto: cambios guardados";
  68.         }else{
  69.             echo"error: no se han guardado los cambios";
  70.         }
  71.     }
  72.     //eliminar todas las tareas
  73.     public function removeAll(){
  74.         exec("crontab -r",$output,$status);
  75.         if($status===0){
  76.             echo"correcto: todas tareas eliminadas";
  77.         }else{
  78.             echo"error: no se han eliminado las tareas";
  79.         }
  80.     }
  81. }
  82. //creo la instancia para probar la clase desde el interprete de php en linea de comandos pondre ejemplos comentados
  83. $task=new ManagerTasks();
  84.  
  85.  
  86. //estos serian unos ejemplos
  87. /*
  88. //crear tareas nuevas
  89. echo $task->createTask("@hourly php '/home/user/script.php");
  90. echo $task->createTask("@hourly php '/home/user/script2.php");
  91. echo $task->createTask("@hourly php '/home/user/script3.php");
  92. //eliminar una tarea
  93. echo $task->deleteTask("@hourly php '/home/user/script2.php");
  94. //editar tiempo de una tarea que se ejecutaba cada hora ahora se debera ejecutar cada 45 min
  95. */
  96. //echo $task->editTaskTime("/home/user/script.php","@hourly","*/45 * * * *");
  97. //eliminar todas las tareas
  98. //echo $task->removeAll();
  99. ?>

esta es la salida es una clase sencilla pero funciona perfecta

[user_cron@server myCron]$ crontab -l
no crontab for user_cron
[user_cron@server myCron]$ php -a
Interactive shell

php > require_once('/home/user_cron/myCron/clase_manager_cron.php');$task->createTask("@hourly php /path/user/script.php");echo"\n";
no crontab for user_cron
no crontab for user_cron
correcto: cambios guardados
php > require_once('/home/user_cron/myCron/clase_manager_cron.php');$task->createTask("@hourly php /path/user/script2.php");echo"\n";
correcto: cambios guardados
php > require_once('/home/user_cron/myCron/clase_manager_cron.php');$task->createTask("@hourly php /path/user/script3.php");echo"\n";
correcto: cambios guardados
php > exit
[user_cron@server myCron]$ crontab -l
@hourly php /path/user/script.php
@hourly php /path/user/script2.php
@hourly php /path/user/script3.php
[user_cron@server myCron]$ php -a
Interactive shell

php > require_once('/home/user_cron/myCron/clase_manager_cron.php');$task->deleteTask("@hourly php /path/user/script2.php");echo"\n";
correcto: cambios guardados
php > exit
[user_cron@server myCron]$ crontab -l
@hourly php /path/user/script.php
@hourly php /path/user/script3.php
[user_cron@server myCron]$ php -a
Interactive shell

php > require_once('/home/user_cron/myCron/clase_manager_cron.php');$task->editTaskTime("/path/user/script3.php","@hourly","*/45 * * * *");echo"\n";
correcto: cambios guardados
php > exit
[user_cron@server myCron]$ crontab -l
@hourly php /path/user/script.php
*/45 * * * * php /path/user/script3.php
[user_cron@server myCron]$ php -a
Interactive shell

php > require_once('/home/user_cron/myCron/clase_manager_cron.php');$task->removeAll();echo"\n";
correcto: todas tareas eliminadas
php > exit
[user_cron@server myCron]$ crontab -l
no crontab for user_cron
[user_cron@server myCron]$


saludos