一、Linux 運(yùn)行jar包的幾種方式
- 方式一: java -jar xxx.jar
最常用的啟動jar包命令,特點(diǎn):當(dāng)前ssh窗口被鎖定,可按CTRL + C打斷程序運(yùn)行,或直接關(guān)閉窗口,程序退出
- 方式二: java -jar xxx.jar &
&代表在后臺運(yùn)行 ,ctrl+c 后程序也會繼續(xù)運(yùn)行
- 方式三: nohup java -jar xxx.jar &
nohup 即 no hang up 不掛斷 ,關(guān)閉SSH客戶端連接,程序不會中止運(yùn)行
缺省情況下該作業(yè)的所有輸出被重定向到nohup.out的文件中,如何讓輸出的內(nèi)容重定向到指定的文件呢?
- 方式四:nohup java -jar xxx.jar >aaa.log &
command >out.file 是將commandd 輸出重定向到out.flie文件,即輸出內(nèi)容不打印到屏幕上,而是輸出到out.file文件中
- 方式五:nohup java -jar spring-boot-demo.jar > springboot.log 2>&1 &

- 方式六:nohup java -jar spring-boot-demo.jar > /dev/null 2>&1 &
不輸出日志
二、nohup 和 &
使用&后臺運(yùn)行程序:
- 結(jié)果會輸出到終端
- 使用
Ctrl + C,程序免疫 - 關(guān)閉
session,程序關(guān)閉
使用nohup運(yùn)行程序:
- 結(jié)果默認(rèn)會輸出到
nohup.out - 使用
Ctrl + C,程序關(guān)閉 - 關(guān)閉
session,程序免疫
平日線上經(jīng)常使用nohup和&配合來啟動程序
三、> /dev/null 2>&1
>標(biāo)準(zhǔn)重定向符,允許我們創(chuàng)建一個(gè) 0KB 的空文件。它通常用于重定向一個(gè)命令的輸出到一個(gè)新文件中。在沒有命令的情況下使用重定向符號時(shí),它會創(chuàng)建一個(gè)文件。/dev/null可以看作黑洞,等價(jià)于一個(gè)只寫文件。所有寫入它的內(nèi)容都會永遠(yuǎn)丟失,嘗試從它那兒讀取內(nèi)容則什么也讀不到。也就是將所有產(chǎn)生的日志將被丟棄2>&1符號>&是一個(gè)整體代表將標(biāo)準(zhǔn)錯(cuò)誤2重定向到標(biāo)準(zhǔn)輸出1,如果是2>1的話,代表將標(biāo)準(zhǔn)錯(cuò)誤輸出到文件1,而不是重定向到標(biāo)準(zhǔn)輸出流
先了解下1和2在Linux中代表什么
當(dāng)Linux執(zhí)行一個(gè)程序時(shí),會自動打開三個(gè)流
0:標(biāo)準(zhǔn)輸入流(默認(rèn)是鍵盤)
1:標(biāo)準(zhǔn)輸出流(默認(rèn)是屏幕)
2:標(biāo)準(zhǔn)錯(cuò)誤流(默認(rèn)是屏幕)
| 名稱 | 代碼 | 操作符 | java中表示 | Linux中文件描述符 |
|---|---|---|---|---|
| 標(biāo)準(zhǔn)輸入(stdin) | 0 | < 或 << | System.in | /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0 |
| 標(biāo)準(zhǔn)輸出(stdout) | 1 | >, >>, 1> 或 1>> | System.out | /dev/stdout -> /proc/self/fd/1 -> /dev/pts/0 |
| 標(biāo)準(zhǔn)錯(cuò)誤輸出(stderr) | 2 | 2> 或 2>> | System.err | /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0 |
從上表看出,平常使用的 echo 'hello' > a.log 可以寫成 echo 'hello' 1> a.log
為什么2>&1要放在后面 ? 如下一條shell命令 nohup java -jar app.jar >log 2>&1 & 我們不妨把1和2都理解是一個(gè)指針,然后來看上面的語句就是這樣的:
本來1----->屏幕 (1指向屏幕)
執(zhí)行>log后, 1----->log (1指向log)
執(zhí)行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)
再來分析下nohup java -jar app.jar 2>&1 >log &
本來1----->屏幕 (1指向屏幕)
執(zhí)行2>&1后, 2----->1 (2指向1,而1指向屏幕,因此2也指向了屏幕)
執(zhí)行>log后, 1----->log (1指向log,2還是指向屏幕)
所以這就不是我們想要的結(jié)果。
每次都寫">log 2>&1"太麻煩,能簡寫嗎?可以簡寫成 &>log 或 >&log
nohup java -jar app.jar 2>&1 >log & 簡寫成:nohup java -jar app.jar &>log &