我如何确定是否还有任何未完成的 Yum 交易需要完成?

我如何确定是否还有任何未完成的 Yum 交易需要完成?

当存在未完成的 Yum 事务时,Yum 在运行以下命令时将输出类似以下内容yum update

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

如何确定是否有未完成的交易且没有任何副作用?(例如,解析 的输出yum update将导致大量副作用,例如更新存储库元数据。)


man 8 yum-complete-transaction建议人们可以简单地检查是否存在匹配的文件/var/lib/yum/{transaction-all,transaction-done}*(强调我的):

yum-complete-transaction 是一个程序,它查找系统上不完整或中止的 yum 事务并尝试完成它们。 如果 yum 事务在执行过程中中止,它会查看 transaction-all* 和 transaction-done* 文件,通常可以在 /var/lib/yum 中找到这些文件

如果它发现多个未完成的事务,它将尝试首先完成最近的事务。您可以多次运行它来清理所有未完成的事务。

然而,这似乎并不完全准确。例如,我有一个系统,其中存在此​​类文件,但yum-complete-transaction报告没有剩余事务需要完成:

[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.

并尝试清理未完成的事务文件,但--cleanup-only无法删除这些文件:

[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

答案1

这是一个输出未完成交易数量的解决方案:

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

根据yum-complete-transactionsfrom 的源代码yum-utils,所有/var/lib/yum/transaction-all*文件都算作未完成的事务......

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

...除了那些以以下结尾的文件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()

不幸的是,后面的代码位于main()的函数内部yum-complete-transaction.py,无法独立调用。如果此代码更加模块化,则可以编写一个 Python 脚本,它比上面给出的 shell 管道更准确地检查未完成的事务。

相关内容