解決Linux下的Wine TIM多次登錄文件夾被佔用的問題
來自專欄一個科班出身計算機工匠的非內卷化學習之路4 人贊了文章
眾所周知,騰訊很早就已經停止了維護 Linux 版本的 QQ,作為 Linux 的用戶只能在 Wine 下使用 QQ 國際版或者 QQ 2012,但是這兩個版本在前段時間又因為版本過低被騰訊停用,無法登陸...
還好在Wine環境下我們可以安裝使用最新的 QQ 或者 TIM,雖然穩定性和用戶體驗有時候有點蛋疼,但是有一些問題我們是可以解決的。
本文就是嘗試解決其中一個問題:當用戶從 TIM 中退出(無論是正常退出還是因為程序崩潰退出),再次進入 TIM 會提示「QQ 個人文件夾中的文件被佔用,暫時無法登陸」。
產生這個問題的原因,我們通過查看進程列表(圖1)可知:在上一次退出 TIM 後,由於各種原因, TIM.exe 這個進程仍然駐留在內存中,並且佔用了 TIM 用戶文件夾等資源沒有釋放,所以導致再次登錄失敗。
這個問題現有的解決辦法,是在 winecfg 的 Libraries 中,添加 TxPlatform.exe,並且設置為"Disable"。這個方法非常的簡單暴力,確實能解決TIM.exe進程駐留的問題,但是也會導致其他的問題。我們可以看一下 TxPlatform 這個進程的一個主要作用:
進程描述:QQ 和 TIM 共同使用的外部應用開發介面管理程序,是一個重要的底層核心模塊。如果刪除該程序,QQ 或 TIM 將喪失與周邊功能模塊以及外部應用程序相互調用的功能。
舉個例子:
在你點擊論壇上面人家的QQ的連接彈出一個臨時聊天的QQ窗口時,這個進程在起作用。主要是驗證雙方的有效性,以及你登錄Q-zone時的身份驗證,都是靠這個進程的;當這個進程不存在時,你登錄Q-zone會嘗試啟動這個進程,如果失敗,則輸入網頁登錄。
因此這個進程在我們從 TIM 跳到騰訊的 WEB 服務(比如郵箱、動態和一系列使用QQ登陸驗證的第三方應用)時候的作用還是很大的,簡單的禁用它也會影響我們使用的體驗。
所以我們解決這個問題的思路是:在每次打開 TIM 進程之前,把所有駐留的 TIM.exe 進程都kill掉,並且把這個過程自動化。
下面進入正題:
環境
Linux 發行版本:Ubuntu LTS 14.04
Wine 版本:Wine 2.0.3
Python版本:Python 3.6 (確保安裝了 psutil 包)
當然,你也可以用C++、perl、shell腳本或者任何一種你熟悉的語言工具來實現它,這裡只是用Python來舉例實現這個方法的思路。
實現
代碼邏輯:
- 運行 TIM 之前,首先要列出當前用戶運行的進程列表;
- 找出所有進程名為"TIM.exe"對應的的進程 p;
- 根據 p 的進程 ID 來 kill掉進程 p;
- 正常運行 TIM 。
在 1 中我們可以用 psutil.pids() 來獲取當前在內存中的所有進程 id ;在 3 中可以用 os.kill() 來殺死進程。這個邏輯實在是很簡單……不多說了直接上代碼:
文件 TIMProcessCleaner.py:
import psutilimport osimport signal# 獲取進程列表process_list = [psutil.Process(pid) for pid in psutil.pids()]# 遍歷並找到TIM.exe對應的pidfor process in process_list: # 如果找到殘留的TIM進程就kill掉 if process.name() == TIM.exe: os.kill(process.pid, signal.SIGKILL)# 啟動TIMos.system("env LC_ALL=zh_CN.utf8 wine /home/hviktortsoi/.wine/drive_c/Program Files/Tencent/TIM/Bin/TIM.exe")
注意這裡最後一行啟動 TIM 的代碼中,wine 後邊的文件路徑要改成你的TIM安裝路徑中TIM.exe所在的位置。
這樣我們先運行 TIM ,然後退出,然後再於當前目錄下執行:
python ./TIMProcessCleaner.py
就可以觀察到,進程列表中原來的 TIM.exe 進程已經被殺掉,並啟動了新的 TIM,而且這次登錄時不會出現"文件夾被佔用"的情況。
如果嫌每次都要這樣打開終端運行命令麻煩,請看下一部分,為我們寫的腳本創建快速啟動欄和桌面的快捷方式。
創建快捷方式
如何在Ubuntu下創建快捷方式這裡就不多講了,網上有大把大把詳細的教程,這裡貼出實現過程和 Desktop 文件的代碼:
首先執行:
sudo vim /usr/share/applications/TIM.desktop
TIM.desktop的代碼:
[Desktop Entry]Encoding=UTF-8Version=1.1.5Name[en_US]=TIMName[zh_CN]=騰訊TIMExec=/home/hviktortsoi/DevTools/anaconda3/bin/python3.6 /home/hviktortsoi/Code/system/TIMProcessCleaner.pyTerminal=falseIcon=/usr/share/icons/TIM.icoNoDisplay=falseStartupNotify=trueType=ApplicationCategories=Network;InstantMessaging;
:wq 保存退出
這裡要特別注意 /home/hviktortsoi/DevTools/anaconda3/bin/python3.6 要改成你的python解釋器路徑。
這樣在快速啟動中就創建了 TIM 的快捷方式,kill 進程的過程對於我們的使用來說就是透明的:)
推薦閱讀:
※Flask系列教程(3)——項目配置
※leetcode上的python練習(5)
※12種降維方法終極指南(含Python代碼)
※Python的函數是第一類對象(函數特性總結)
※從0開始學python-3.1 列表容器