Cuando estoy en un entorno de test con aplicaciones en Laravel (esto es extrapolable a cualquier otro entorno de desarrollo y/o framework que disponga de una interfaz de línea o CLI), a veces ejecuto comandos cuya ejecución puede llevar bastante tiempo.
Un ejemplo claro es una migración con un seeder con un alto número de seeds, para probar la aplicación con un entorno sobrecargado de datos.
En este tipo de casos lo ideal es poder dejar el comando en background y poder cerrar la consola si es necesario.
Un ejemplo práctico de esta situación es la ejecución del comando
php artisan migrate:refresh --seed
que resetea todas las migraciones, vuelve a ejecutarlas y luego alimenta la base de datos con los seeders programados.
Para resolver la problemática puedo ejecutar
nohup php artisan migrate:refresh --seed > nohup.log 2>&1 &
- “nohup” evita que el comando que viene a continuación finalice al cerrar la sesión o al salir de la shell.
- “> nohup.log” envía la salida del comando al archivo “nohup.log”.
- “php artisan migrate:refresh –seed” resetea todas las migraciones, vuelve a ejecutarlas y luego alimenta la base de datos con los seeders programados.
- “2>&1” redirige la salida del canal 2 (error estándar) al canal 1 (salida estándar). Como la salida estándar ya estaba redirigida hacia un archivo (> nohup.log), toda la información acabará en el archivo “nohup.log”.
- “&” ejecuta el comando en background, devolviendo el control de la consola para poder seguir usándola.
Por lo tanto, tras ejecutar este comando podré seguir usando la consola y/o cerrar la sesión y el comando seguirá ejecutándose.
Si en vez de almacenar el log en un archivo lo quiero descartar, simplemente tengo que ejecutar
nohup php artisan migrate:refresh --seed > /dev/null 2>&1 &
/dev/null descarta toda la información que se escribe o redirige en él.
Si quiero ver en tiempo real el log de la ejecución del comando, tengo que ejecutar
tail -f nohup.log