前言
好久沒更新技術(shù)文章了,如果細算的話,或許可能大概已經(jīng)有半年之久了。。
一方面是身體原因?qū)е卢F(xiàn)在精力大不如以前了,這個很多關(guān)注我的老讀者應(yīng)該都知道,我就不一直拿這個說事了,說多了總感覺自己太矯情。
另一方面應(yīng)該也是自己懶散習慣了,就不想再費力寫一些文章了,不過我也不想為自己的懶惰做開脫,實事求是就是了。
寫過文章的作者應(yīng)該深有體會,寫一篇文章真的要耗費非常久的時間和精力??赡軜I(yè)余時間和周末都會被寫文章所占領(lǐng)。
我曾經(jīng)寫過一篇文章,用下班的業(yè)余時間寫的,可能你想象不到我用了多久才寫出來。斷斷續(xù)續(xù)寫了差不多一個星期才完事,我想再慢的作者應(yīng)該也沒有我這么笨了。
但是,為什么我現(xiàn)在又開始寫了呢?
主要是最近查資料,發(fā)現(xiàn)我的csdn一直都有人在關(guān)注我,評論我。沒想到這篇 HashMap 在 csdn 閱讀量已經(jīng)破萬了。

導致我內(nèi)心有非常大的愧疚感,愧疚這么久了不更新,竟然還有人關(guān)注我,點贊支持我。愧疚大家都在為了學習奮力拼搏,而我卻止步不前。
所以我痛定思痛,決定重新規(guī)劃我的寫文章計劃。(不立 flag,怕倒。。)
電腦如何雙開微信
寫下這篇文章,是因為我發(fā)現(xiàn)之前用的 mac 上的雙開微信軟件報風險了,就不敢再用了。但是,很多人像我一樣又有雙開微信的需求的,那么怎樣才能雙開甚至多開微信呢?
下面就介紹一種樸實無華,不用任何插件和軟件的方式實現(xiàn)你的需求。
windows系統(tǒng)雙開微信方法
可能很多人是在 windows 系統(tǒng)上運行微信的,那么首先說一下 win 上怎么雙開微信。
其實主要是通過 start 命令來開啟一個新的程序,我們先看一下 start 的語法。
在終端輸入命令:start /? 可以打開 start 的幫助文檔。

上圖說的已經(jīng)很清楚了,我就不再贅述了。對于我們來說,主要關(guān)注微信的安裝包路徑。例如我的在 D盤,完整路徑為:D:\Program Files (x86)\Tencent\WeChat\Wechat.exe
我們試一下,直接運行 start D:\Program Files (x86)\Tencent\WeChat\Wechat.exe
卻發(fā)現(xiàn)提示,找不到相對應(yīng)的文件。

仔細看就會發(fā)現(xiàn),提示的是找不到文件 D:\Program。發(fā)現(xiàn)了點什么沒有,很明顯,系統(tǒng)識別不了空格,以為我訪問的是路徑是 D:\Program,直接把空格后邊的截斷了,所以報錯。
因此,對于路徑中有空格的,我們需要加引號來處理。
再次運行 start "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe"。

會發(fā)現(xiàn),啟動了一個新窗口,但還是啟動不了微信。
此時,只需要在路徑前面加上空白雙引號"",表示創(chuàng)建一個空白的窗口,來指向我們要打開的程序。
完整命令為 start "" "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe",成功打開微信。
注意:執(zhí)行命令時,需要微信是未打開的狀態(tài),如果已經(jīng)打開一個微信了,則不會生效。
因此,如果我們需要雙開微信的話,就需要寫一個批處理腳本,一次運行多個程序,這樣就不會出現(xiàn)命令失效的問題。
新建一個文件,名字隨便起,例如我起的就是“微信多開”。然后,后綴名改為.bat格式。

用記事本或者 notepad++ 等編輯工具打開,輸入上邊的命令兩行,即代表打開兩個微信客戶端。
start "" "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe"
start "" "D:\Program Files (x86)\Tencent\WeChat\Wechat.exe"
輸入多行,則代表同時打開多個微信。保存,退出。
然后直接雙擊運行 .bat 文件,即可。
mac系統(tǒng)雙開微信方法
再來說下 mac 系統(tǒng)下怎么雙開微信。其實,也是通過命令的方式,只不過是用 linux 命令來實現(xiàn)(mac 也是類unix系統(tǒng),因此和 linux 命令類似)。
如果沒有耐心看下去的話,直接運行以下命令即可多打開一個微信客戶端。
nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 &
但是,作為技術(shù)人員,還是多了解一些 linux 知識比較好(雖然比較基礎(chǔ)。。)
輸出重定向
在 linux 中,標準的輸入設(shè)備默認就是指鍵盤,標準的輸出設(shè)備默認就是指顯示器,對于命令行來說就是輸出在終端上。
重定向顧名思義,
- 輸入重定向就是把輸入從鍵盤重定向到其他設(shè)備。
- 輸出重定向就是把輸出從顯示器重定向到其他設(shè)備(一般重定向到文件)。
這里需要說明一下,輸入只有標準輸入(stdin),而輸出分為標準輸出(stdout)和標準錯誤輸出(stderr)。std 是標準的英語單詞 standard 縮寫。
在 linux 下,認為一切皆為文件。這里的文件不僅指普通意義上的文件,還包括目錄,進程(/proc),設(shè)備(/dev),套接字等。
而每個文件都有一個文件描述符,值是一個非負整數(shù)(>=0)。
所以,輸入輸出也有對應(yīng)的文件描述符(file descriptor,會發(fā)現(xiàn)很多地方都把文件描述符簡寫為fd)。
| 輸入輸出設(shè)備 | 文件描述符 |
|---|---|
| 標準輸入 | 0 |
| 標準輸出 | 1 |
| 標準錯誤輸出 | 2 |
輸入重定向的命令符號為 <,輸出重定向的命令符號為 >。
例如 echo hello 1> file 即是代表,本來要打印 hello 字符串到標準輸出設(shè)備(終端上),但是 1> file把它的輸出結(jié)果重定向到了 file 文件中。最終會發(fā)現(xiàn) file 文件中會多了一行“hello”字符。
ps:通常,標準輸出重定向 1> ,也可以省略掉文件描述符1,簡寫為 >。注意文件描述符和重定向符號之間是沒有空格的。
/dev/null 被稱為空設(shè)備,是一個特殊的設(shè)備文件。所有寫入其中的數(shù)據(jù)都會被丟棄,也就是我們通常說的“黑洞”,吞噬一切。
所以, /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 這句話的意思就是把命令執(zhí)行后的標準輸出重定向到空設(shè)備文件中,也就是在終端不顯示任何標準輸出消息。
2>&1,中 &表示等同的意思,2>&1 就表示 2 的輸出重定向等同于 1 。也就是標準錯誤輸出重定向等同于標準輸出重定向。
所以 > /dev/null 2>&1 就代表,標準錯誤輸出等同于標準輸出,都重定向到空設(shè)備文件。就算命令運行報錯,也不會在終端輸出任何錯誤信息。因此,當我們的程序運行不需要輸出任何信息(包括報錯信息)的時候,通常使用這個命令。
nohup 和 & 命令
首先要明確這是兩個命令,它們代表不同的含義,產(chǎn)生不一樣的效果。
nohup 全稱是 no hang up ,意思是不掛斷。 & 是指后臺運行。
為了測試他們的不同,我們以一段 Java 代碼為例。(每隔一秒打印一下當前系統(tǒng)時間)
import java.text.SimpleDateFormat;
import java.util.Date;
public class TestRun {
public static void main(String[] args) throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
while(true){
System.out.println("當前時間:" + sdf.format(new Date()));
Thread.sleep(1000);
}
}
}
保存文件為 TestRun.java ,然后 javac TestRun.java 編譯為 class 文件。
我們在終端直接輸入 java TestRun 來運行程序。會發(fā)現(xiàn),程序正常執(zhí)行,每隔一秒輸出一下當前系統(tǒng)時間。

此時按下 ctrl + c 鍵發(fā)送 SIGINT 信號,程序接收到信號之后就會直接停止,不再輸出任何東西到控制臺。
這是因為,我們運行的方式默認是前臺運行的。
如果以后臺方式運行,會有什么效果呢?
在終端輸入 java TestRun & ,會先在終端顯示程序的進程號 3120 。

然后同樣按下 ctrl + c 發(fā)送 SIGINT 信號,會發(fā)現(xiàn)程序并沒有停止,而是繼續(xù)運行。
我們可以在終端打開另外一個窗口,輸入 ps aux|grep TestRun 來驗證是否程序真的在繼續(xù)運行.

如上圖,進程 3120 確實還在運行中。
此時,關(guān)閉第一個會話窗口(sesson),給程序發(fā)送 SIGHUP 信號會怎樣呢?

再次 ps 查看,會發(fā)現(xiàn)原先的進程 3120 也停止了。
如果以 nohup 方式運行,會有什么效果呢?
在終端輸入命令 nohup java TestRun ,

會有一段提示 "appending output to nohup.out",終端也沒有任何程序的輸出信息。
我們先不管這個 nohup.out 是什么,稍等再說。
另外打開一個窗口,ps 查看一下此時的進程號,為 3256 。

同樣的先按下 ctrl + c 發(fā)送 SIGINT 信號給程序,

會發(fā)現(xiàn),程序響應(yīng)后停止運行了。也可以手動 ps 驗證一下,

進程號 3256 確實被停止了。
再次運行 nohup java TestRun,來驗證關(guān)閉 session 會怎樣。ps 查看進程號為 3386 。

然后把第一個 session 關(guān)閉,發(fā)送 SIGHUP 信號,會發(fā)現(xiàn)進程號 3386 依舊在。

我們再看下,nohup.out 是什么鬼?
其實 nohup 會默認(在非重定向時)在當前目錄下,輸出一個 nohup.out 文件。程序的輸出都保存在 nohup.out 文件中。

至此,我們明白了他們之間的區(qū)別:
& 是以后臺的方式運行程序,結(jié)果輸出到終端。程序響應(yīng) SIGHUP 信號,而不響應(yīng) SIGINT 信號。
nohup 是不掛斷的方式運行程序,結(jié)果默認輸出到 nohup.out 文件。程序響應(yīng) SIGINT 信號,而不響應(yīng) SIGHUP 信號。
因此,我們通常會把 nohup 和 & 結(jié)合起來使用,對 SIGINT 和 SIGHUP 信號都不響應(yīng)。這樣程序就只能通過 kill 來關(guān)閉了。
實際上,nohup 的完整語法如下,
nohup Command [ Arg … ] [ & ],
- command 為要執(zhí)行的命令,例如上邊的 java TestRun
- Arg 為可選項,可以輸出重定向(到文件),默認不寫的話就會在當前目錄生成一個 nohup.out 文件來保存輸出內(nèi)容
- & 為可選項,表示后臺運行。
所以,如果要打開一個新的微信客戶端,并且讓它后臺運行,不響應(yīng)任何信號。同時,不在終端顯示任何輸出信息,結(jié)合上邊的輸出重定向到文件,就可以這樣寫,
nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 &
- nohup 和 結(jié)尾的 & 同時使用,保證程序不會被掛斷和關(guān)閉。
-
/Applications/WeChat.app/Contents/MacOS/WeChat,用來啟動微信客戶端的命令。mac 下大家微信的安裝目錄都是這個。 -
> /dev/null 2>&1 &表示標準輸出和標準錯誤輸出都重定向到空設(shè)備文件,即不顯示。
雙開微信腳本
最后,我們可以編寫一個 shell 腳本來雙開微信,在任意目錄(我在當前登錄用戶的桌面上 ~/Desktop)新建一個 openWechat.sh 。然后輸入,
nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 &
nohup /Applications/WeChat.app/Contents/MacOS/WeChat > /dev/null 2>&1 &
保存,退出。
在當前目錄下執(zhí)行 sh openWechat.sh 即可同時打開兩個微信客戶端。若需要多開,則多加幾行同樣的命令。
PS:使用命令的方式,不會對微信軟件本身有侵入性,所以也可以放心的使用。慎用第三方軟件。
本篇文章由一文多發(fā)平臺ArtiPub自動發(fā)布