Como posso determinar se há alguma transação Yum pendente a ser completada?

3

Quando houver transações Yum inacabadas pendentes, o Yum exibirá algo como o seguinte ao executar comandos como yum update :

There are unfinished transactions remaining. You might consider
running yum-complete-transaction first to finish them.

Como posso determinar se existem transações não-concluídas sem efeitos colaterais? (Por exemplo, analisar a saída de yum update causará muitos efeitos colaterais, como a atualização dos metadados do repositório.)

man 8 yum-complete-transaction sugere que se pode simplesmente verificar a existência de arquivos correspondentes a /var/lib/yum/{transaction-all,transaction-done}* (ênfase minha):

yum-complete-transaction is a program which finds incomplete or aborted yum transactions on a system and attempts to complete them. It looks at the transaction-all* and transaction-done* files which can normally be found in /var/lib/yum if a yum transaction aborted in the middle of execution.

If it finds more than one unfinished transaction it will attempt to complete the most recent one first. You can run it more than once to clean up all unfinished transactions.

No entanto, isso não parece ser totalmente preciso. Por exemplo, eu tenho um sistema em que esses arquivos existem, mas yum-complete-transaction informa que não há transações a serem concluídas:

[myhost ~]% ls /var/lib/yum/{transaction-all,transaction-done}*
/var/lib/yum/transaction-all.2016-11-23.07:15.21.disabled
/var/lib/yum/transaction-done.2016-11-23.07:15.21.disabled
[myhost ~]% sudo yum-complete-transaction 
Loaded plugins: product-id, refresh-packagekit, rhnplugin
No unfinished transactions left.

E a tentativa de limpar os arquivos de transação inacabados com --cleanup-only não remove esses arquivos:

[myhost ~]% sudo yum-complete-transaction --cleanup-only                   
Loaded plugins: product-id, refresh-packagekit, rhnplugin
No unfinished transactions left.
[myhost ~]% ls /var/lib/yum/{transaction-all,transaction-done}*
/var/lib/yum/transaction-all.2016-11-23.07:15.21.disabled
/var/lib/yum/transaction-done.2016-11-23.07:15.21.disabled
    
por jayhendren 28.12.2016 / 20:12

1 resposta

2

Aqui está uma solução que gera uma contagem do número de transações não concluídas:

find /var/lib/yum -maxdepth 1 -type f -name 'transaction-all*' -not -name '*disabled' -printf . | wc -c

De acordo com o código-fonte para yum-complete-transactions de yum-utils , todos os arquivos /var/lib/yum/transaction-all* são contados como transações não-fundidas ...

def find_unfinished_transactions(yumlibpath='/var/lib/yum'):
    """returns a list of the timestamps from the filenames of the unfinished
       transactions remaining in the yumlibpath specified.
    """
    timestamps = []
    tsallg = '%s/%s' % (yumlibpath, 'transaction-all*')
    #tsdoneg = '%s/%s' % (yumlibpath, 'transaction-done*') # not used remove ?
    tsalls = glob.glob(tsallg)
    #tsdones = glob.glob(tsdoneg) # not used remove ?

    for fn in tsalls:
        trans = os.path.basename(fn)
        timestamp = trans.replace('transaction-all.','')
        timestamps.append(timestamp)

    timestamps.sort()
    return timestamps

... exceto os arquivos que terminam com disabled :

    times = []
    for thistime in find_unfinished_transactions(self.conf.persistdir):
        if thistime.endswith('disabled'):
            continue
        # XXX maybe a check  here for transactions that are just too old to try and complete?
        times.append(thistime)

    if not times:
        print "No unfinished transactions left."
        sys.exit()

Infelizmente, o último código está dentro da função main() de yum-complete-transaction.py e não pode ser chamado de forma independente. Se esse código fosse mais modularizado, seria possível escrever um script Python que analise com mais precisão as transações não concluídas do que o pipeline de shell fornecido acima.

    
por 28.12.2016 / 20:56

Tags