linux - tareas - ¿Cómo puedo crear programáticamente un nuevo trabajo cron?
instalar crontab ubuntu (15)
Añadiendo a la respuesta de JohnZ, aquí está la sintaxis para programar como root si eres sudoer:
(sudo crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | sudo crontab -
Quiero ser capaz de agregar programáticamente un nuevo trabajo cron, ¿cuál es la mejor manera de hacer esto?
De mi investigación , parece que podría volcar el crontab actual y luego anexar uno nuevo, conectando de nuevo con crontab:
(crontab -l ; echo "0 * * * * wget -O - -q http://www.example.com/cron.php") | crontab -
¿Hay una mejor manera?
Aquí hay otra manera de una sola línea, que evita duplicados
(crontab -l 2>/dev/null | fgrep -v "*/1 * * * * your_command"; echo "*/1 * * * * your_command") | crontab -
Y aquí hay una manera de hacer la respuesta de JohnZ y evitar no crontab for user
mensaje del no crontab for user
, o si necesita operar en un set -eu
tipo set -eu
y no puede tener nada que devuelva un error (en cuyo caso la parte 2>/dev/null
es opcional):
( (crontab -l 2>/dev/null || echo "") ; echo "0 * * * * your_command") | sort -u - | crontab -
O si quiere dividir las cosas para que sean más legibles:
new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
(echo "$preceding_cron_jobs" ; echo "$new_job") | sort - | uniq - | crontab -
O bien, elimine de forma opcional cualquier referencia a su_comando (por ejemplo: si la programación ha cambiado, solo querrá que se cronomede una vez). En este caso, ya no necesitamos uniq
(la bonificación adicional, el orden de inserción también se conserva):
new_job="0 * * * * your_command"
preceding_cron_jobs=$(crontab -l || echo "")
preceding_cron_jobs=$(echo "$preceding_cron_jobs" | grep -v your_command )
(echo "$preceding_cron_jobs" ; echo "$new_job") | crontab -
El stdout de tubería en crontab
no instaló el nuevo crontab para mí en macOS, así que encontré esta solución en su lugar, usando el editor de tee
en un subconjunto:
(EDITOR=tee && (crontab -l ; echo "@daily ~/my-script.sh" ) | uniq - | crontab -e)
Esto verificará para asegurarse de que su comando no exista antes de agregarlo.
crontab -l 2>/dev/null | grep -q ''/path/to/script'' || echo "5 * * * * /path/to/script" | crontab -
Aclamaciones.
La mejor forma de ejecutar root es soltar un archivo en /etc/cron.d
Si usa un administrador de paquetes para empaquetar su software, puede simplemente establecer los archivos en ese directorio y se interpretan como si fueran crontabs, pero con un campo adicional para el nombre de usuario, por ejemplo:
Nombre de archivo: /etc/cron.d/per_minute
Contenido: * * * * * root /bin/sh /home/root/script.sh
La solución de OP tiene un error, puede permitir que las entradas se agreguen dos veces, use debajo para corregir.
(crontab -l ; echo "0 * * * * your_command") | sort - | uniq - | crontab -
Para agregar algo a cron
(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | sort | uniq | crontab -
Para eliminar esto de cron
(crontab -l ; echo "0 * * * * hupChannel.sh") 2>&1 | grep -v "no crontab" | grep -v hupChannel.sh | sort | uniq | crontab -
la esperanza ayudaría a alguien
Si estás planeando hacerlo para un escenario de una sola vez para simplemente obtener algo, echa un vistazo a ''at''
Siempre me ha funcionado bien.
Debería considerar un script ligeramente más sofisticado que puede hacer tres cosas.
Agregar una línea crontab; asegurándose de que no existía. Agregar cuando ya existe es malo.
Elimina la línea crontab. Quizás solo advirtiendo si no existió.
Una combinación de las dos características anteriores para reemplazar la línea crontab.
Simplemente cambie el editor al comando tee:
export EDITOR = "tee"
echo "0 * * * * / bin / echo ''Hola mundo''" | crontab -e
Suponiendo que ya hay una entrada en su crontab, el siguiente comando debería funcionar relativamente bien. Tenga en cuenta que la variable $CMD
solo está ahí para facilitar la lectura. La ordenación antes de filtrar duplicados es importante, porque uniq
solo funciona en líneas adyacentes.
CMD=''wget -O - -q http://www.example.com/cron.php"''
(crontab -l ; echo "0 * * * * $CMD") | sort | uniq | crontab -
Si actualmente tiene un crontab vacío, recibirá el siguiente error en stderr:
no crontab for user
Si desea evitar esto, puede agregar un poco de complejidad para agregar algo como esto:
(crontab -l ; echo "0 * * * * $CMD") 2>&1 | sed "s/no crontab for $(whoami)//" | sort | uniq | crontab -
También puede editar el archivo de texto de la tabla cron directamente, pero su solución parece perfectamente aceptable.
man crontab también es útil:
CRONTAB (1)
NOMBRE
crontab - manipulate per-user crontabs (Dillon''s Cron)
SINOPSIS
crontab file [-u user] - replace crontab from file
crontab - [-u user] - replace crontab from stdin
crontab -l [user] - list crontab for user
también puede agregar sus tareas a /etc/cron.*/
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;
}
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;
}
append_cronjob(''* * * * * curl -s http://localhost/cron/test.php'');