2012-06-05 13 views
7

Sto avendo strani effetti collaterali sul cambio LD_LIBRARY_PATH.LD_LIBRARY_PATH effetti collaterali

Quando accludo un percorso contenente una libreria, ad es. :

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib 

Quindi, tutto diventa incredibilmente lento. Ad esempio, un semplice ls può essere lungo 10 secondi.

ldd uscita è esattamente lo stesso prima e dopo la modifica LD_LIBRARY_PATH e ho cercato di eseguire il debug l'esecuzione del lento ls con strace: ottengo la stessa identica esecuzione in entrambi i casi. L'esecuzione non si blocca nemmeno durante l'esecuzione di ls (poiché strace non emette alcunché durante il ritardo di 10 secondi e quindi esegue improvvisamente perfettamente ls). Così ho pensato che potesse provenire dalla mia shell, ma questo è lo stesso, eseguendo strace sulla mia bash e eseguendo ls in entrambi i casi mi dà lo stesso output strace: la shell esegue ls e aspetta la fine della sua esecuzione (l'ultimo strace uscita prima del ritardo strace è waitpid(...)). Quindi immagino che qualcosa di sbagliato accada tra il lancio di ls e la sua esecuzione, come se si trattasse di un problema a livello di kernel. Funziona davvero come se uno sleep sia stato creato su ls (0 utilizzo della CPU).

Durante il ritardo, la mia CPU e attività di rete sono perfettamente normale ...

Si noti che la biblioteca nel nuovo percorso LD non sia in conflitto con qualsiasi "libreria standard", in modo da non disturbare ls nella mia esempio.

Quindi sono interessante nelle spiegazioni più dettagliate sugli effetti collaterali LD_LIBRARY_PATH o su come eseguire il debug approfondito del mio esempio.

+0

Buona domanda. Ho usato 'LD_LIBRARY_PATH' e non ho mai visto un simile comportamento, tuttavia la tua osservazione sembra sia isolata che chiara. Interessante. – thb

+7

'export LD_DEBUG = all' e' man 8 ld.so' –

+0

è ovvio ma "ldd $ (which ls)" può dare un indizio se ls usa qualcosa da LD_LIBRARY_PATH. – Matthias

risposta

0

Non so cos'altro c'è sul tuo LD_LIBRARY_PATH o nella libreria che stai cercando di aggiungere o quale programma stai usando, ma probabilmente stai meglio scrivendo uno script di wrapper per cambiare LD_LIBRARY_PATH solo per il programma che ha bisogno di extra libreria in modo che il tuo sistema funzioni come ls non siano interessati.

#!/bin/bash 
export LD_LIBRARY_PATH=/my_path/lib 
program_name 

Creare file e la chmod +x wrapper_name

+1

Sì, sono d'accordo con te, ma sono solo una vittima di un sistema di generazione esistente ... –

1

Questo post è smettere di vecchio, quindi non so se si trova già una soluzione. Ad ogni modo, non so se questo possa essere d'aiuto, ma nella maggior parte dei sistemi GNU/Linux moderni, l'uso di LD_LIBRARY_PATH è deprecato e sconsigliato.

quindi ho un paio di suggerimenti:

  1. se si desidera continuare ad usarlo, prova prima con pre-attesa invece di aggiungere il vostro percorso della libreria al LD_LIBRARY_PATH. Ciò dovrebbe essere d'aiuto se c'è qualcosa che richiede molto tempo per eseguire la scansione del percorso nelle directory delle librerie precedenti.

  2. Utilizzare il sistema LDCONFIG, che è il (nuovo) modo corretto di utilizzare le directory LD al giorno d'oggi. È sufficiente aggiungere il percorso alla libreria nel file /etc/ld.so.conf o, meglio, aggiungere un file in /etc/ld.so.conf.d/che contiene il percorso della libreria (sarà originato se è presente una direttiva di inclusione in /etc/ld.so.conf, che di solito è il caso per impostazione predefinita). Quindi eseguire sudo ldconfig per aggiornare il percorso di ricerca LD del sistema.

Spero che questo aiuto. Cheers

Problemi correlati