find y sed string en la ventana acoplable recibió el error `Dispositivo o recurso ocupado`


10

Este problema solo ocurre en el contenedor acoplable.

Solo findestá bien:

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"

find con sed

find ${BASIN_SPIDER_CONFIG_PATH} -type f -name "*.json"|xargs sed -i "s/10.142.55.199/host02/g"

da un error:

/xxx/config/sed8Ey5tD: Device or resource busy

No entiendo lo que es sed8Ey5tD, lsno puedo verlo. Creo que es por docker, pero no puedo entenderlo.

¿Cómo hacer el sedéxito?


OK, he encontrado que el archivo está siendo volumed por estibador, existe volumes: /xxx/config.json : /xxx/config/config.json en docker-compose.yml. Después docker-compose down, el archivo se puede editar. Pero, ¿cómo edito el archivo sin docker-compose down?


Es un archivo temporal creado por sed. Cuando realice una modificación en el lugar, sedcreará un archivo temporal para trabajar para evitar corromper su original. Si algo salió bien, entonces reemplaza el original por uno temporal. Pero cual es tu pregunta? ¿Quieres saber qué causa ese error o qué es el sed8Ey5tDarchivo?
Cuonglm

@cuonglm Quiero saber cómo hacer que sed tenga éxito.
Mithril

¿estás seguro de que tienes permisos de escritura dentro del contenedor?
user1700494

@ user1700494 usuario root
Mithril

puede intentar forzar sedpara que no haya un archivo de respaldo xargs sed -i'' "s/10.142.55.199/host02/g"(agregue comillas simples justo después de la -iclave)
user1700494

Respuestas:


10

Sí, como descubrió, el archivo está montado por docker, lo que significa que no puede cambiar su inodo desde el contenedor de docker. Pero, ¿qué sucede si solo cambia el contenido del archivo sin tocar su inodo, funciona? Claro que si. Por lo tanto, todo lo que necesita hacer es encontrar una manera de cambiar el contenido del archivo original únicamente, en lugar de crear un nuevo archivo y luego reemplazar el original.

El comando sedcon opción -icrea un archivo nuevo y luego reemplaza el archivo antiguo por el nuevo, lo que definitivamente cambiará el inodo del archivo. Por eso te da el error.

Entonces, ¿qué formas pueden cambiar el contenido del archivo? De muchas maneras

  1. redirección de shell, por ejemplo, echo abc > file
  2. comando cp, por ejemplo,cp new old
  3. empuje
  4. ed

Le damos varios ejemplos de cómo solucionar su problema:

El cpcamino:

buscar $ {BASIN_SPIDER_CONFIG_PATH} -tipo f -name "* .json" | xargs -L1 fiesta -c 'sed "s / 10.142.55.199 / host02 / g" $ 1> /tmp/.intermediate-file-2431; cp /tmp/.intermediate-file-2431 $ 1; ' -

El vimcamino

cat> / tmp / vim-temp-script << EOF
: establezca nobackup backupcopy = yes
: let i = 0
: mientras 1
: sea i + = 1
:% s / 10.142.55.199 / host02 / g
: si i> = argc ()
: rotura
: terminara si
: wn
: mientras tanto
: wq
EOF 
encuentra $ {BASIN_SPIDER_CONFIG_PATH} -tipo f -name "* .json" | xargs vim -s / tmp / vim-temp-script

El edcamino

encuentre $ {BASIN_SPIDER_CONFIG_PATH} -tipo f -name "* .json" | xargs -L1 bash -c 'ed $ 1 << EOF
, s / 10.142.55.199 / host02 / g
wq
EOF '-

0

En mi opinión, la forma más fácil de hacerlo es usar lo siguiente en un Dockerfile:

RUN cp /etc/hosts /etc/hosts2 && sed -i 's/::1  localhost/::1/g' /etc/hosts2
CMD cat /etc/hosts2 >> /etc/hosts
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.