Cita:
Iniciado por Triby 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<?php
class ManagerTasks {
//recuperar tareas con array de salida
private function recoverTasks(){
exec("crontab -l",$output); return $output;
}
//convertir array de las tareas a cadena
private function convertString($chores){
}
//verificar si existe la tarea para eliminar o borrar o editar posteriormente
private function exists($chores,$serverTask){
return true;
}
return false;
}
//crear nueva tarea
public function createTask($serverTask){
$chores=$this->recoverTasks();
$exists=$this->exists($chores,$serverTask);
if($exists===false){
$chores[]=$serverTask;
return $this->saveTasks($chores);
}
echo"error: la tarea ya existe";
}
//eliminar una tarea existente
public function deleteTask($serverTask){
$chores=$this->recoverTasks();
$exists=$this->exists($chores,$serverTask);
if($exists===true){
//al tener solo una eliminamos todas
return $this->removeAll();
}else{
foreach($chores as $key => $value){
if($serverTask==$value){
break;
}
}
return $this->saveTasks($chores);
}
}
echo"error:la tarea no existe";
}
//editar el tiempo de tarea: parametros (ruta del script,tiempo actual,tiempo nuevo)
//con tiempo me refiero a cuando se ejecuta la tarea ejemplo '*/30 * * * *' cada 30min
public function editTaskTime($route,$currentTime,$newTime){
$chores=$this->recoverTasks();
foreach($chores as $key => $line){
$chores[$key]=$new;
return $this->saveTasks($chores);
}
}
}
//guardar cambios despues de crear, editar o eliminar una tarea
private function saveTasks($chores){
$choresString=$this->convertString($chores);
exec("crontab -l | echo '$choresString' | crontab -",$output,$status); if($status===0){
echo"correcto: cambios guardados";
}else{
echo"error: no se han guardado los cambios";
}
}
//eliminar todas las tareas
public function removeAll(){
exec("crontab -r",$output,$status); if($status===0){
echo"correcto: todas tareas eliminadas";
}else{
echo"error: no se han eliminado las tareas";
}
}
}
//creo la instancia para probar la clase desde el interprete de php en linea de comandos pondre ejemplos comentados
$task=new ManagerTasks();
//estos serian unos ejemplos
/*
//crear tareas nuevas
echo $task->createTask("@hourly php '/home/user/script.php");
echo $task->createTask("@hourly php '/home/user/script2.php");
echo $task->createTask("@hourly php '/home/user/script3.php");
//eliminar una tarea
echo $task->deleteTask("@hourly php '/home/user/script2.php");
//editar tiempo de una tarea que se ejecutaba cada hora ahora se debera ejecutar cada 45 min
*/
//echo $task->editTaskTime("/home/user/script.php","@hourly","*/45 * * * *");
//eliminar todas las tareas
//echo $task->removeAll();
?>
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