La stringa find e sed nella finestra mobile ha ottenuto l'errore "Dispositivo o risorsa occupata"


10

Questo problema si verifica solo nel contenitore finestra mobile.

Va solo findbene:

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"

dà un errore:

/xxx/config/sed8Ey5tD: Device or resource busy

Non capisco cosa sia sed8Ey5tD, lsnon riesco a vederlo. Penso che sia dalla finestra mobile, ma non riesco a capirlo.

Come avere sedsuccesso?


OK, ho trovato che file sia voluminose dalla finestra mobile, non v'è volumes: /xxx/config.json : /xxx/config/config.json in docker-compose.yml. Dopo docker-compose down, il file può essere modificato. Ma come posso modificare il file senza docker-compose down?


È un file temporaneo creato da sed. Quando si esegue la modifica sul posto, sedverrà creato un file temporaneo su cui lavorare per evitare di danneggiare l'originale. Se qualcosa è andato bene, sostituisce l'originale con uno temporaneo. Ma qual è la tua domanda? Vuoi sapere quale causa di quell'errore o qual è il sed8Ey5tDfile?
cuonglm,

@cuonglm Voglio sapere come avere successo.
Mithril,

sei sicuro di avere i permessi di scrittura all'interno del contenitore?
user1700494,

@ user1700494 utente root
Mithril

potresti provare a forzare seda non creare file di backup xargs sed -i'' "s/10.142.55.199/host02/g"(aggiungi virgolette singole subito dopo la -ichiave)
user1700494

Risposte:


10

Sì, come hai scoperto, il file è montato dalla finestra mobile, il che significa che non è consentito modificare il suo inode dal contenitore della finestra mobile. Ma cosa succede se si modifica il contenuto del file senza toccarne l'inode, funziona? Certo, lo fa. Quindi tutto ciò che devi fare è trovare un modo per cambiare solo il contenuto del file originale, piuttosto che creare un nuovo file e quindi sostituire quello originale.

Il comando sedcon opzione -icrea un nuovo file, quindi sostituisce il vecchio file con quello nuovo, che sicuramente cambierà l'inode del file. Ecco perché ti dà l'errore.

Quindi, quali modi possono cambiare il contenuto del file? Molti molti modi.

  1. reindirizzamento della shell, ad es. echo abc > file
  2. comando cp, ad es.cp new old
  3. vim
  4. Ed

Fornisci diversi esempi su come risolvere il problema:

Il cpmodo:

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

La vimstrada

cat> / tmp / vim-temp-script << EOF
: set nobackup backupcopy = yes
: let i = 0
: mentre 1
: let i + = 1
:% s / 10.142.55.199 / host02 / g
: if i> = argc ()
: rompere
: finisci se
: wn
: ENDWHILE
: wq
EOF 
trova $ {BASIN_SPIDER_CONFIG_PATH} -type f -name "* .json" | xargs vim -s / tmp / vim-temp-script

La edstrada

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

0

Imho, il modo più semplice per farlo è utilizzare quanto segue in un file Docker:

RUN cp /etc/hosts /etc/hosts2 && sed -i 's/::1  localhost/::1/g' /etc/hosts2
CMD cat /etc/hosts2 >> /etc/hosts
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.