当存在未完成的 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-transactions
from 的源代码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 管道更准确地检查未完成的事务。