Yum

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

  • December 30, 2016

當有未完成的 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 事務並嘗試完成它們。 它查看 transaction-all 和 transaction-done 文件,如果 yum 事務在執行過程中中止,這些文件通常可以在 /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

這是一個輸出未完成交易數量的解決方案:

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 管道更準確地檢查未完成的事務。

引用自:https://unix.stackexchange.com/questions/333336