¿Por qué no está y trabajando?

0

Así que ejecuté el comando find / .bash_profile para ver si existía en algún lugar de mi Mac antes de crear uno. La búsqueda de todo el equipo, obviamente, toma un minuto, así que quería ejecutarlo en segundo plano (algo que no había intentado hacer antes), así que agregué un & hasta el final, como tal: find / .bash_profile &

Sin embargo, en lugar de ejecutarlo en segundo plano y dejarme hacer otras cosas, ¡esto hizo que el proceso fuera ininterrumpible! Continuó corriendo en primer plano pero Ctrl + do Ya no tuvo ningún efecto; solo se podía detener cerrando la instancia del terminal por completo.

¿Que me estoy perdiendo aqui?

temporary_user_name
fuente
Ctl-c no tuvo efecto porque se estaba ejecutando en el fondo. Las interrupciones del teclado solo afectan el trabajo en primer plano.
Barmar
Si estás en una Mac, ¿por qué estás usando find En lugar de Spotlight?
Barmar
2
@Barmar - porque la línea de comandos es la interfaz de usuario del SO CORRECTO ... ;-)
SaxDaddy
Si desea hacer una pausa o interrumpirlo mientras se ejecuta en segundo plano (lo que hizo, a pesar de emitir la salida al terminal), envíe un kill (-1 HUP para detener o suspender / reanudar. Consulte kill -l ). Alternativamente, traerlo de vuelta al primer plano con fg o fg %jobnumber (ver jobs ) y luego Control-C o Control-Z it.
Hennes
Si desea hacer esto con frecuencia y no desea utilizar Spotlight, puede habilitar la locate instalación y luego usar locate .bash_profile. Si intenta ese comando ahora, le dirá cómo habilitarlo permanentemente.
Barmar

Respuestas:

3

De hecho, se está ejecutando en segundo plano y puede hacer otras cosas, pero cada vez que produce algo, lo hace a su terminal actual.

Sugerencia: find / -name .bash_profile >my_result.txt 2>/dev/null &

Esto guarda la salida en un archivo y descarta todos los errores (como el error de permiso denegado). Puede verificar el estado mirando en el archivo de salida tail my_result.txt o escribiendo jobs.

Si necesitas matar el trabajo, escribe kill %1 donde 1 es el número de trabajo en jobs.

Alex
fuente
Dos cosas agradables más para agregar opcionalmente a la publicación: 1) colas -f opción 2) traerlo de vuelta al primer plano y matarlo allí ( fg control-c ). +1 por mencionar también stderr.
Hennes
Que es 2>? No estoy seguro de cómo se llama, así que no estoy seguro de cómo buscarlo en Google.
temporary_user_name
@Aerovistae: 2 es stderr, abreviatura de error estándar. 2>/dev/null significa que los errores son redirigidos a /dev/null
Alex
¡Gracias! Tiene sentido. Encontré una manera de buscarlo, también. No estoy seguro de que 0> lo haría aunque ... aparentemente redirige stdin .... que pensé que tenía que usar <
temporary_user_name
3

¿Estás seguro de que el proceso estaba en primer plano? Solo porque estaba escribiendo la salida en el terminal no significa que estuviera en primer plano.

Si tiene un comando que produce salida y desea ejecutarlo en segundo plano, debieras redirigir La salida, como:

find / -name .bash_profile > find_results &

Es normal que el proceso de fondo sea inmune a las interrupciones ( Ctrl + do ) para que pueda interrumpir su trabajo de primer plano sin interferir con los trabajos de fondo. (Tenga en cuenta, por cierto, que recibió el comando incorrecto.)

G-Man
fuente
1

Te has topado con una de mis mascotas con find. Intenta usar el -print opción como tal

find / -name '.bash_profile' -print > some_file

También es posible que se encuentre con un problema al no escaparse o citar el punto en el nombre del archivo. find admite la sintaxis RegEx para que el punto en el nombre del archivo pueda ser mal interpretado. Cualquiera de los ejemplos a continuación debe abordar esto

find / -name 'some_file.txt' ...

o

find / -name some_file\.txt ...

Las comillas simples son más flexibles porque no tienes que escapar cada controla los caracteres y puedes encerrarlos más fácilmente como @ o /

SaxDaddy
fuente
(2) Si bien es una buena idea citar cadenas constantes y es esencial que cite cadenas que contengan caracteres especiales (o que escape de los caracteres especiales), punto (es decir, punto, es decir, . ) no es un personaje especial en este contexto. find … -name no trata su argumento como un RegEx completo (ver -regex ) y por eso no se trata . como especial Incluso si lo hiciera (por ejemplo, si nosotros fueron hablando sobre -regex ), no importaría citar la cadena o escapar del personaje; necesitarías escapar del personaje y Cita la cadena. Y que estas diciendo @ y /?
G-Man
(1) ¿Cuál es el motivo de la mascota? ¿Por qué crees eso diciendo -print explícitamente hace una diferencia? Es la acción por defecto ("expresión").
G-Man
Supongo que es un motivo favorito porque habría escrito esto de modo que "imprimir" fuera el comportamiento predeterminado implícito. Y mientras que el hallazgo puede no tratar un punto en el contexto de expresiones regulares, podría Ser malinterpretado como el directorio actual. También he tenido problemas con la necesidad de escapar de @ aunque un ejemplo, irónicamente, se me escapa.
SaxDaddy