php - sistema - wp cron scheduled task
Use PHP para crear, editar y eliminar trabajos crontab? (12)
¿Es posible usar PHP para crear, editar y eliminar trabajos de crontab?
Sé cómo enumerar los trabajos de crontab actuales del usuario de Apache:
$output = shell_exec(''crontab -l'');
echo $output;
Pero, ¿cómo agregar un trabajo cron con PHP? ''crontab -e'' simplemente abriría un editor de texto y usted tendrá que editar manualmente las entradas antes de guardar el archivo.
¿Y cómo eliminar un trabajo cron con PHP? De nuevo, tiene que hacer esto manualmente mediante ''crontab -e''.
Con una cadena de trabajo como esta:
$job = ''0 */2 * * * /usr/bin/php5 /home/user1/work.php'';
¿Cómo lo agrego a la lista de trabajos de crontab con PHP?
Bonito...
Intenta esto para eliminar un trabajo cron específico (probado).
<?php $output = shell_exec(''crontab -l''); ?>
<?php $cron_file = "/tmp/crontab.txt"; ?>
<!-- Execute script when form is submitted -->
<?php if(isset($_POST[''add_cron''])) { ?>
<!-- Add new cron job -->
<?php if(!empty($_POST[''add_cron''])) { ?>
<?php file_put_contents($cron_file, $output.$_POST[''add_cron''].PHP_EOL); ?>
<?php } ?>
<!-- Remove cron job -->
<?php if(!empty($_POST[''remove_cron''])) { ?>
<?php $remove_cron = str_replace($_POST[''remove_cron'']."/n", "", $output); ?>
<?php file_put_contents($cron_file, $remove_cron.PHP_EOL); ?>
<?php } ?>
<!-- Remove all cron jobs -->
<?php if(isset($_POST[''remove_all_cron''])) { ?>
<?php echo exec("crontab -r"); ?>
<?php } else { ?>
<?php echo exec("crontab $cron_file"); ?>
<?php } ?>
<!-- Reload page to get updated cron jobs -->
<?php $uri = $_SERVER[''REQUEST_URI'']; ?>
<?php header("Location: $uri"); ?>
<?php exit; ?>
<?php } ?>
<b>Current Cron Jobs:</b><br>
<?php echo nl2br($output); ?>
<h2>Add or Remove Cron Job</h2>
<form method="post" action="<?php $_SERVER[''REQUEST_URI'']; ?>">
<b>Add New Cron Job:</b><br>
<input type="text" name="add_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<b>Remove Cron Job:</b><br>
<input type="text" name="remove_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<input type="checkbox" name="remove_all_cron" value="1"> Remove all cron jobs?<br>
<input type="submit"><br>
</form>
Depende de dónde almacene su crontab:
shell_exec(''echo "''. $job .''" >> crontab'');
En lugar de crontab también puede usar la cola de tareas del motor de la aplicación de Google. Tiene una cuota libre generosa, es rápida, escalable y modificable.
Es simple. Puedes enrollarte para hacerlo, asegúrate de que curl esté instalado en el servidor:
para activar cada minuto: * * * * * curl --request POST '' https://glassdoor.com/admin/sendBdayNotification ''
- *
minuto hora día mes semana
Supongamos que desea enviar esta notificación a las 2:15 pm todos los días . Puede cambiar POST / GET en función de su API:
15 14 * * * curl --request POST ''url of ur API''
Esto debería hacerlo
shell_exec("crontab -l | { cat; echo ''*/1 * * * * command''; } |crontab -");
Intenté la solución a continuación
class Crontab {
// In this class, array instead of string would be the standard input / output format.
// Legacy way to add a job:
// $output = shell_exec(''(crontab -l; echo "''.$job.''") | crontab -'');
static private function stringToArray($jobs = '''') {
$array = explode("/r/n", trim($jobs)); // trim() gets rid of the last /r/n
foreach ($array as $key => $item) {
if ($item == '''') {
unset($array[$key]);
}
}
return $array;
}
static private function arrayToString($jobs = array()) {
$string = implode("/r/n", $jobs);
return $string;
}
static public function getJobs() {
$output = shell_exec(''crontab -l'');
return self::stringToArray($output);
}
static public function saveJobs($jobs = array()) {
$output = shell_exec(''echo "''.self::arrayToString($jobs).''" | crontab -'');
return $output;
}
static public function doesJobExist($job = '''') {
$jobs = self::getJobs();
if (in_array($job, $jobs)) {
return true;
} else {
return false;
}
}
static public function addJob($job = '''') {
if (self::doesJobExist($job)) {
return false;
} else {
$jobs = self::getJobs();
$jobs[] = $job;
return self::saveJobs($jobs);
}
}
static public function removeJob($job = '''') {
if (self::doesJobExist($job)) {
$jobs = self::getJobs();
unset($jobs[array_search($job, $jobs)]);
return self::saveJobs($jobs);
} else {
return false;
}
}
}
créditos a: Crontab Class para agregar, editar y eliminar trabajos de Cron
La forma más fácil es usar el comando shell_exec para ejecutar un script bash, pasando los valores como parámetros. Desde allí, puede manipular los crontabs como lo haría en cualquier otro script no interactivo, y también asegurarse de tener los permisos correctos utilizando sudo, etc.
Mira esto, Crontab sin crontab -e , para más información.
Podría intentar anular la EDITOR
entorno EDITOR
con algo como ed
que puede tomar una secuencia de comandos de edición sobre la entrada estándar.
Puede poner su archivo en /etc/cron.d/ en formato cron. Agregue un prefijo único al archivonaname Para enumerar trabajos cron específicos del script, simplemente trabaje con una lista de archivos con un prefijo único. Borre el archivo cuando desee deshabilitar el trabajo.
Recientemente, preparamos un mini proyecto (PHP> = 5.3) para administrar los archivos cron para tareas privadas e individuales. Esta herramienta conecta y administra los archivos cron para que pueda usarlos, por ejemplo, por proyecto. Pruebas unitarias disponibles :-)
Muestra de línea de comando:
bin/cronman --enable /var/www/myproject/.cronfile --user www-data
Muestra de API:
use php/manager/crontab/CrontabManager;
$crontab = new CrontabManager();
$crontab->enableOrUpdate(''/tmp/my/crontab.txt'');
$crontab->save();
Gestionando tareas individuales desde API:
use php/manager/crontab/CrontabManager;
$crontab = new CrontabManager();
$job = $crontab->newJob();
$job->on(''* * * * *'');
$job->onMinute(''20-30'')->doJob("echo foo");
$crontab->add($job);
$job->onMinute(''35-40'')->doJob("echo bar");
$crontab->add($job);
$crontab->save();
github: php-crontab-manager
Revisa un cronjob
function cronjob_exists($command){
$cronjob_exists=false;
exec(''crontab -l'', $crontab);
if(isset($crontab)&&is_array($crontab)){
$crontab = array_flip($crontab);
if(isset($crontab[$command])){
$cronjob_exists=true;
}
}
return $cronjob_exists;
}
Agregar un cronjob
function append_cronjob($command){
if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE){
//add job to crontab
exec(''echo -e "`crontab -l`/n''.$command.''" | crontab -'', $output);
}
return $output;
}
Eliminar un crontab
exec(''crontab -r'', $crontab);
Ejemplo
exec(''crontab -r'', $crontab);
append_cronjob(''* * * * * curl -s http://localhost/cron/test1.php'');
append_cronjob(''* * * * * curl -s http://localhost/cron/test2.php'');
append_cronjob(''* * * * * curl -s http://localhost/cron/test3.php'');
uso del comando crontab
usage: crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
(default operation is replace, per 1003.2)
-e (edit user''s crontab)
-l (list user''s crontab)
-r (delete user''s crontab)
-i (prompt before deleting user''s crontab)
Asi que,
$output = shell_exec(''crontab -l'');
file_put_contents(''/tmp/crontab.txt'', $output.''* * * * * NEW_CRON''.PHP_EOL);
echo exec(''crontab /tmp/crontab.txt'');
Lo anterior se puede usar tanto para crear como para editar / agregar siempre que el usuario tenga el permiso de escritura de archivo adecuado.
Para eliminar trabajos:
echo exec(''crontab -r'');
Además, tenga en cuenta que apache se está ejecutando como un usuario particular y que, por lo general, no es root, lo que significa que los trabajos cron solo se pueden cambiar para el usuario apache a menos que se le crontab -u
privilegio crontab -u
al usuario apache.