Come posso ottenere un codice di uscita apt-get 'dettagliato'?


12

Come posso ottenere un codice di uscita "dettagliato" per apt-geterrori come questo

Package google-chrome is a virtual package provided by:
  google-chrome-stable 29.0.1547.76-r223446
  google-chrome-beta 30.0.1599.47-1
You should explicitly select one to install.

E: Package 'google-chrome' has no installation candidate

hanno un codice di uscita diverso rispetto agli errori di download come questo

Err http://dl.google.com/linux/chrome/deb/ stable/main google-chrome-stable amd64 29.0.1547.76-r223446
  Something wicked happened resolving 'dl.google.com:http' (-11 - System error)

Attualmente, entrambi gli errori escono con 100

Fondamentalmente, vorrei che gli errori di download uscissero con un codice diverso rispetto agli errori come il primo. Se possibile, vorrei che ogni errore specifico avesse un codice di uscita diverso, ma l'esempio sopra è il minimo che mi serve. Come posso farlo in un'installazione Ubuntu vanilla senza software aggiuntivo (ad eccezione di aptitude)?


È possibile racchiudere il comando apt-get in uno script che analizza l'output. Oppure conta come "software aggiuntivo"? Inoltre, per rilevare errori di download, considera di fare apt-get --download-onlyprima.
Jos

Ah, ha senso. Forse potresti verificare prima l'esistenza del pacchetto X apt-cache policy X?
Jos

Ancora una volta, è necessario grep l'output. Suppongo che fare apt-cache policy google-chromenon ti dia una linea con la parola "Candidato", mentre lo apt-cache policy google-chrome-stablefarebbe.
Jos

OK. Sto spostando questa discussione per chattare e inserendo questo suggerimento come risposta (parziale).
Jos

Risposte:


1

Non è una risposta completa, ma è possibile verificare prima l'esistenza dei pacchetti eseguendo apt-cache policy Xe disattivando l'output per "Candidate (none)" o "Impossibile trovare il pacchetto X", ecc.


Eseguito l'upgrade per ora, ma come hai detto, è parziale. Sentiti libero di eliminare tutti i tuoi commenti che è in una risposta ora. Grazie per il tuo aiuto
kiri,

15

Credo che questo non sia un caso di XY, e vuoi solo essere in grado di eseguire il debug di apt-get in generale. Sotto tali ipotesi ecco la mia risposta.

Dal man apt.conf:

OPZIONI DI DEBUG

L'abilitazione delle opzioni nella sezione Debug :: farà sì che le informazioni di debug vengano inviate al flusso di errori standard del programma utilizzando le librerie apt o abiliteranno speciali modalità di programma che sono principalmente utili per il debug del comportamento di apt.

Quindi, devi solo attivare le regole per ciascuno dei comportamenti di debug di apt-get:

  • Debug :: pkgProblemResolver : abilita l'output delle decisioni prese tramite dist-upgrade, upgrade, install, remove, purge.
  • Debug :: NoLocking : disabilita tutto il blocco dei file. Questo può essere usato per eseguire alcune operazioni (ad esempio apt-get -s install) come utente non root.
  • Debug :: pkgDPkgPM : stampa la riga di comando effettiva ogni volta che apt invoca dpkg (1).

Quei 3 sono i primi che la pagina man raccomanda e il primo ti aiuterà a eseguire il debug del primo errore che mostri. Per il secondo potresti aver bisogno di:

  • Debug :: Acquire :: http : stampa le informazioni relative al download di pacchetti tramite HTTP. C'è anche https, ftp, cdrom.

La pagina man ne ha molte altre, puoi elencarle facilmente usando man apt.conf | grep -A5 -i debug .

Tutto questo dovrebbe essere scritto usando la sintassi corretta e sono accettati valori booleani:

Debug::*::*  "true";

o se si desidera utilizzare più righe:

Debug {
  Acquire {
    http "true";
    ftp "true";
  };
  NoLocking "true";
};

Se vuoi correre solo per un'istanza di apt-get puoi usare l' opzione -o/ --option:

sudo apt-get -o Debug::pkgProblemResolver=true -o Debug::Acquire::http=true -f install 

Un altro metodo consiste nel creare il file di configurazione personalizzato e caricarlo con l' opzione -c/ --config-file:

sudo apt-get -c debug-apt.conf install hello

A proposito di cambiare i codici di uscita, credo che tu non possa farlo se non cambi il codice sorgente. apt-getè un software all'avanguardia , in quanto tale ha metodi avanzati per eseguire il debug del processo senza la necessità di fare affidamento sui codici di uscita.


In realtà sto cercando di inserire questi comandi in uno script che può essere eseguito incustodito. Come lo userei in uno script bash per scoprire se si è verificato il primo errore?
Kiri,

Vorrei anche farlo solo per un'istanza specifica di apt-get, non sempre.
Kiri,

@ minerz029 puoi usare l' -oopzione per eseguire comandi ad-hoc. Aggiornato la mia risposta.
Braiam,

A proposito del primo commento, dovresti fare qualcosa di intelligente con l'analisi dell'output. Non ho l'idea di non vedere come puoi farlo.
Braiam,

In realtà l'ho fatto funzionare con il grepping dell'output di apt-cache policy PACKAGE, come ha detto Jos. Stavo cercando di verificare se un pacchetto era installabile, potrei non aver fatto la mia domanda giusta, ma questa è una buona risposta
kiri
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.