Ejecuté el siguiente bloque de código (un at
tiempo de espera para desinstalar PHPmyadmin). Debería estar programado para ejecutarse 2 horas antes, pero lo ejecuté en un tiempo de espera de 2 minutos, solo para probarlo:
bash /dev/fd/50 50<< PMA_UNINSTALL | at 'now + 2 minutes'
apt-get purge phpmyadmin -y
PMA_UNINSTALL
La at
utilidad parece impedirme usar Bash libremente, a menos que lo haga CTRL+ C. At
también muestra la siguiente advertencia, que es normal y está codificada en el código fuente de la utilidad. Cuando hago CTRL+, Cla advertencia desaparece y puedo volver a usar Bash con regularidad.
Los comandos se ejecutarán usando /bin/sh.
No digo que sea la advertencia la que me impide usar Bash regularmente mientras aparezca. Sé que la advertencia es simplemente una salida estándar y que algo más podría impedirme crear una entrada estándar.
¿Qué me impide crear una canalización estándar con el bloque de código anterior at
y cómo podría alcanzar un estado en el que pueda ejecutar comandos canalizados con at, pero usar Bash libremente inmediatamente después sin interrumpir at
el trabajo?
Respuesta1
Me tomó algo de tiempo ver su problema real: desea enviar un comando directamente at
en lugar de proporcionar comandos después, como supuse.
No es necesario un esquema complicado, simplemente escriba
echo 'apt-get purge phpmyadmin -y' | at 'now + 2 minutes'
Cuando lo hace de esta manera, at
no espera ninguna entrada posterior y regresa a la línea de comando inmediatamente.
(manteniendo mi respuesta original aquí)
Emitir at
le brinda la posibilidad de enumerar los comandos para ejecutar. Tienes que decir at
que ya terminaste:
Presione CTRL+ D(Esto también se conoce comoFin de la transmisión)
Respuesta2
TL;DR: Esos comandos no parecen hacer lo que probablemente pretendes.
Si está intentando ejecutar at
en apt-get purge phpmyadmin -y
2 bash
minutos, entonces su código no hará lo que usted desea.
El comando a la izquierda de la tubería ( |
) tiene su documento aquí como entrada estándar. Ese comando ni siquiera se ejecuta hasta que el shell haya leído su documento completo aquí.
De3.6.6 Aquí documentosen elManual de referencia de bash:
Este tipo de redirección le indica al shell que lea la entrada de la fuente actual hasta que aparezca una línea que contenga solopalabra(sin espacios en blanco al final). Todas las líneas leídas hasta ese punto se utilizan como entrada estándar (o descriptor de archivo).nortesinortese especifica) para un comando.
Un comando con un documento aquí es, en efecto, solo un comando que el shell debe leer completamente antes de ejecutarlo. En su código, el shell lee la entradahasta PMA_UNINSTALL
aparece en una línea por sí solo. Una vez que esto ha sucedido, el caparazónentoncesutiliza el contenido del documento aquí como descriptor de archivo 50 para el comando bash /dev/fd/50
.
Ese comando ni siquiera inicia una nueva instancia bash
hasta que el documento aquí se haya leído por completo. Cuando bash
se ejecuta, ejecuta este comando:
apt-get purge phpmyadmin -y
Dado que todo el lado izquierdo de la tuberíaincluyendo el documento aquítiene su salida estándar canalizada a at
, la entrada at
que obtiene es laproducciónde bash
, que es la salida de apt-get purge phpmyadmin -y
. at
luego intenta interpretar esa salida, no su apt-get
comando, sino suproducción--como una lista de comandos para ejecutar en /bin/sh
.
Así que es casi seguro que esto no es lo que pretendes hacer.
No estoy seguro de por qué no aparece un mensaje de shell inmediatamente después de ingresar ese código. Cuando lo ejecuto en una máquina de prueba, aparece un mensaje de shell en un par de segundos. Si desea depurar esto, puede intentar ejecutarlo apt-get purge phpmyadmin -y
de forma interactiva en bash. La forma en que está escrito su código, ese comando se ejecuta completamenteantes at
regresa al shell (y antes at
puede programar cualquier cosa). Sin embargo, probablemente no sería útil depurar más este código en particular.