job - ejecutar crontab manualmente
¿Ejecuta dos comandos secuencialmente en un trabajo cron? (2)
Tengo dos comandos en un trabajo cron como este:
mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1";wget -N http://mywebsite.net/path/AfterMyFunction1.php
pero me parece que ambos funcionan al mismo tiempo.
¿Cómo puedo hacer que se ejecute el primer comando y cuando se completa, ejecuta el segundo comando?
Además, AfterMyFunction1.php tiene solicitudes http de JavaScript que no se ejecutan cuando uso wget. Funciona si abrí AfterMyFunction1.php en mi navegador web.
Puede usar sem
que es parte de GNU parallel
.
0 0 * * * root sem --jobs 1 --id MyQueue mysql -xxxxxx -pyyyyyyyyyyv -hlocalhost -e "call MyFunction1"
1 0 * * * root sem --jobs 1 --id MyQueue wget -N http://mywebsite.net/path/AfterMyFunction1.php
Esta configuración de cron primero iniciará el mysql
través de sem
, que lo pondrá en una especie de cola llamada MyQueue
. Esta cola probablemente estará vacía, por lo que mysql
se ejecuta inmediatamente. Un minuto después, el cron iniciará otro sem
que colocará el wget
en la misma cola. Con --jobs 1
, se indica a sem
que ejecute solo un trabajo a la vez en esa cola en particular. Tan pronto como el mysql
haya terminado, el segundo sem
ejecutará el comando wget
. sem
tiene muchas opciones para controlar el comportamiento de la cola. Por ejemplo, si agrega --semaphoretimeout -60
, un trabajo en espera simplemente morirá después de 60 segundos.
La solución &&
es probablemente mejor, ya que no ejecutará el segundo comando cuando el primero falle. La solución sem
tiene la ventaja de que puede especificar diferentes configuraciones cron, como un usuario diferente. Y evitará la superposición de trabajos cron, si el intervalo cron es más corto que la duración del trabajo.
Si primero se requiere completar el primer comando, debe separarlos con el operador && como lo haría en el shell. Si el primero falla, el segundo no se ejecutará.