¿Es posible de alguna manera de ejecutar la tarea rake sólo si no se está ejecutando, quiero usar cron para ejecutar algunas tareas rastrillo rastrillo, pero la tarea no debe comenzar si llamada anterior no ha terminado Graciascomisión si ya se está ejecutando
Respuesta
Utilizo lockrun para evitar que las tareas cron se ejecuten varias veces (esto solo funciona al invocar el comando a través de la misma invocación lockrun
, por lo que si necesita protegerse de varias rutas de invocación, deberá buscar otros métodos)
En su crontab, se invoca así:
*/5 * * * * /usr/local/bin/lockrun --lockfile=/tmp/this_task.lockrun -- cd /my/path && RAILS_ENV=production bundle exec rake this:task
La solución general no específica de rake es utilizar un archivo pid como un bloqueo. Envolvería la tarea de rake en una secuencia de comandos que crea este archivo cuando ejecuta rake, lo elimina cuando Rake termina de ejecutarse, y lo busca antes de comenzar.
No estoy seguro si el rastrillo tiene algo incorporado, no sé de nada.
Hice tales cosas con php y una vez al mes el archivo de bloqueo no se eliminó de alguna manera ... así que creo que no es una solución al 100% – Fivell
Si coloca el PID en el archivo y comprueba si se está ejecutando (en lugar de solo la existencia del archivo), es posible que pueda eliminar el bloqueo de manera más confiable. – spike
¡buena idea! gracias – Fivell
Si simplemente desea omitir esta tarea de rake, también puede usar la base de datos para almacenar información sobre el progreso de la tarea (por ejemplo, actualizar un campo al iniciar y finalizar una tarea determinada) y verificar esa información antes de ejecutar cada tarea.
Sin embargo, si desea un comportamiento similar a una cola, puede considerar crear un daemon para manejar las tareas. El proceso es muy simple y te da mucho más control. Hay una muy buena transmisión sobre esto: Custom Daemon
El enfoque daemon también evitará que los entornos de rieles se carguen nuevamente en cada tarea. Esto es especialmente útil si sus tareas de rake son frecuentes.
Además, se puede utilizar un fichero de bloqueo, pero manejarlo de la tarea:
def lockfile
# Assuming you're running Rails
Rails.root.join('tmp', 'pids', 'leads_task.lock')
end
def running!
`touch #{lockfile}`
end
def done!
`rm #{lockfile}`
end
def running?
File.exists?(lockfile)
end
task :long_running do
unless running?
running!
# long running stuff
done!
end
end
Esto probablemente podría ser extraído en algún tipo de módulo, pero entiendes la idea.
Aquí está mi variante con bloqueo de archivos para tareas de rastrillado de rieles.
poner esto en su archivo tarea rastrillo (bajo espacio de nombres, por lo que suele superponen con otras tareas rake):
def cron_lock(name)
path = Rails.root.join('tmp', 'cron', "#{name}.lock")
mkdir_p path.dirname unless path.dirname.directory?
file = path.open('w')
return if file.flock(File::LOCK_EX | File::LOCK_NB) == false
yield
end
uso:
cron_lock 'namespace_task_name' do
# your code
end
ejemplo completo:
namespace :service do
def cron_lock(name)
path = Rails.root.join('tmp', 'cron', "#{name}.lock")
mkdir_p path.dirname unless path.dirname.directory?
file = path.open('w')
return if file.flock(File::LOCK_EX | File::LOCK_NB) == false
yield
end
desc 'description'
task cleaning: :environment do
cron_lock 'service_cleaning' do
# your code
end
end
end
- 1. ¿Cómo comprobar si una aplicación WPF ya se está ejecutando?
- 2. Verificando un proceso php ya se está ejecutando
- 3. ¿Cancelar una tarea que ya se está ejecutando con Apio?
- 4. Comprobar si el proceso se está ejecutando
- 5. Verifica programáticamente si se está ejecutando syncdb
- 6. eclipse stop popup "Lanzamiento web ya se está ejecutando"
- 7. ¿Cómo puedo saber si un proceso ya se está ejecutando usando C#?
- 8. Python: Cómo prohibir la apertura de una aplicación si ya se está ejecutando
- 9. Determine si ya se está ejecutando una secuencia de comandos de ruby
- 10. ¿Un trabajo de SQL Server saltará una ejecución programada si ya se está ejecutando?
- 11. cómo evitar que el servicio se ejecute nuevamente si ya está ejecutando android
- 12. ¿Cómo comprobar si la intención pendiente activada por AlarmManager setRepeating ya se está ejecutando?
- 13. ¿Cómo manejar las notificaciones push si la aplicación ya se está ejecutando?
- 14. PyQt: ¿cómo detectar y cerrar la IU si ya se está ejecutando?
- 15. Detectando si ya se está ejecutando otra instancia de la aplicación
- 16. Cómo comprobar si se está ejecutando un Thread de Android
- 17. Descubriendo si la actividad de Android se está ejecutando
- 18. Powershell: si un proceso no se está ejecutando, inícielo
- 19. encontrar un trabajo si se está ejecutando en Quartz1.6
- 20. Cómo saber si el servidor de emacs se está ejecutando
- 21. Determinar si el programa se está ejecutando en Windows Server
- 22. ¿Cómo verificar si el servidor X se está ejecutando?
- 23. ¿Cómo detectar con precisión si un trabajo de SQL Server se está ejecutando y lidiar con el trabajo que ya se está ejecutando?
- 24. Comprobar si la animación se está ejecutando en cocos2d-x
- 25. OSX: ¿Cómo detectar si se está ejecutando Mission Control?
- 26. Shell script: Asegúrese de que la secuencia de comandos no se ejecuta si ya se está ejecutando
- 27. Cómo determinar si una aplicación web se está ejecutando actualmente
- 28. ¿Cómo puedo saber si un proceso se está ejecutando?
- 29. Cómo rastrear si se está ejecutando una tarea async/awaitable
- 30. ¿Cómo saber si se está ejecutando un temporizador?
gracias por la respuesta nunca escuchado sobre lockrun – Fivell
También hay rebaños (con frecuencia en/usr/bin/flock) en algunos sistemas - la pregunta no especificaba el sistema operativo. –
El problema con el rebaño es que no puede ejecutar un comando con más de un argumento, por lo que 'rake task_name' es dos argumentos y, por lo tanto, falla. – yekta