Cómo hacer que el tiempo de espera (1) se comporte en cron como se comporta en el shell interactivo

Cómo hacer que el tiempo de espera (1) se comporte en cron como se comporta en el shell interactivo

Ejecutando este comando en una fiesta interactiva:

$ timeout 1 sleep 2; echo $?
124

devoluciones124después de 1 segundo, como se esperaba y según lo documentado en el tiempo de espera (1).

Sin embargo, si ejecuto lo mismo como un trabajo cron, o si lo doy como una cadena de comando para bash, no ocurre lo siguiente:

$ bash -c "timeout 1 sleep 2; echo $?"
0

Agregar -ia la invocación de bash no ayuda, ni tampoco usar el --foregroundparámetro de tiempo de espera (1). También intenté lo mismo con ksh y zsh, pero siempre obtengo el mismo resultado, así que supongo que debe ser algo inherente a la forma en que funciona el tiempo de espera (1).

Busqué un poco en la red y descubrí que podría tener que ver con cómo procede la señalización a través de los grupos de procesos, pero no pude encontrar una solución para hacer que el tiempo de espera funcione como se esperaba en el caso no interactivo.

¿Alguna pista sobre cómo podría lograrlo? En última instancia, lo que quiero es ejecutar un comando en cron que probablemente se bloquee para siempre y quiero detectar ese caso de manera confiable.

Respuesta1

Debido a las comillas dobles, $?se está ampliando.antesSe invoca el comando bash. Está siendo reemplazado por el estado de salida delanteriorcomando (que fue el primero exit $?)

Una demostración rápida

bash -c 'exit 42'
bash -c "timeout 1 sleep 2; echo $?"   # => 42

La solución es utilizarcomillas simplespara que el proceso bash interactivo actual no expanda la variable

bash -c 'timeout 1 sleep 2; echo $?'   # => 124

Respuesta2

Puedes intentar ejecutar el comando de esta manera:

bash -c "timeout 1 sleep 2"; echo $?

información relacionada