① linux 常用命令(要求全而精)
1、linux分區
--在linux裡面所有的設備、任何東西,在linux看來都是文件。
--文件在它看來,有兩種形式:
第一種是字元型(鍵盤輸入、列印機);
第二種是二進制型(硬碟、光碟機、U盤)
--linux中所有硬體
--手動分區
--A、至少有兩個分區
/ 根分區
SWAP 交換分區(物理內存大小的兩倍)
--B、個人桌面分區
/
/boot 128MB is enough
/usr
SWAP
/tmp(用於光碟刻錄)
2、linux目錄說明
--/dev/xxyN
--xx (分區所在設備類型:hd--IDE硬碟 sd--SCSI硬碟)
--y (標明分區所在設備
例如:/dev/hda 第一個IDE硬碟 或 /dev/hdb 第二個IDE硬碟 或 /dev/sdb 第二個SCSI硬碟)
--N (數字代表分區:1-4--主分區或擴展分區;邏輯分區從5開始!
例如:/dev/hda3 第一個IDE硬碟上的第三個主分區或擴展分區
/dev/sdb6 第二個SCSI硬碟上的第二個邏輯分區)
3、linux目錄結構
/ 根目錄,最高級別
/bin 系統基本命令存放目錄(/usr/bin)
/boot linux的內核及引導系統程序文件存放目錄(如:vmlinuz、initrd.img)
一般情況下,GRUB或LILO系統引導管理也位於這個目錄
/dev 設備文件存儲目錄,如音效卡、光碟機...
/ect 存放系統設置文件(如用戶賬號密碼、伺服器配置文件等)
/home 普通用戶家目錄,默認存放目錄
/lib 庫文件存放目錄
/lost+found 在ext2或ext3文件系統中,當系統以外崩潰或機器意外關機,而產生一些文件碎片放在這里。
當系統啟動的過程中,fsck工具會檢查這里,並修復已經損壞的文件系統。
有事喜用發生問題,有很多的文件被移到這個目錄中,可能會用手工的方式來修復,或者移文件到原來的位置上。
/media 即插即用型存儲設備的掛載點自動在這個目錄下創建。
如USB盤系統自動掛在後,會在這個目錄下產生一個目錄;
類似cdrom的目錄
/mnt 存放掛載存儲設備的掛載目錄,如cdrom等目錄
/opt 表示可選的意思,有些軟體包也會被安裝在此,也就是自定義軟體包,
比如OpenOffice,或者一些我們自己編譯的軟體包,也可安裝此處。
/proc 操作系統運行時,進程(正在運行的程序)信息及內核信息(比如CPU、硬碟分區、內存信息等)存放在此。
/proc目錄是偽裝的文件系統proc的掛載目錄,proc並不是真正的文件系統
/root linux超級許可權用戶root的家目錄
/sbin 大多是涉及系統管理的命令的存放,只有超級許可權用戶root才可執行命令存放,普通用戶無許可權執行此目錄下的命令
與 /usr/sbin; /usr/X11R6/sbin; usr/local/sbin 目錄相似
(sbin,只有root許可權才能執行)
/tmp 臨時文件目錄,有時用戶運行程序的時候,會產生臨時文件。
/var/tmp目錄和此目錄相似
/usr 系統存放程序的目錄,如命令、幫助文件等。這個目錄下有很多的文件和目錄。
大部分Linux發行版提供的軟體包都安裝在此,涉及伺服器的配置文件就安裝在/ect中。
/usr/share/fonts 字體目錄
/usr/share/man 或 /usr/share/doc 幫助目錄
/usr/bin 或 /usr/local/bin 或 /usr/X11R6/bin 普通用戶可執行文件目錄
/usr/sbin 或 /usr/local/sbin 或 /usr/X11R6/sbin 超級許可權用戶root可執行命令存放目錄
/usr/include 程序頭文件存放目錄
/var (vary)此目錄經常變動
/var/log 用來存放系統日誌
/var/www 用來定義Apache伺服器站點存放
/var/lib 用來存放一些庫文件,如MySQL的,以及MySQL資料庫的存放地。
4、基本命令
--查看幫助 *** --help *** --?
--查看詳細幫助 man ***
--登錄 login
--退出窗口 exit
--關機 shutdown
--重啟 reboot
--初始化 init (run level -/etc/inittab),0-6看第六部分的g
--進入根目錄 cd /
--回上層目錄 cd ..
--相對路徑 cd dev
--絕對路徑 cd /dev
--查用戶名 whoami
--查當前目錄 pwd
--列出當前目錄內容 ls
-l(樹詳細顯示目錄內容)
-m(橫列顯示目錄內容,是屏幕長度顯示)
-a(列出全部文件,包括隱藏文件)
-S(以文檔大小排序)
--創建目錄 mkdir dname
--刪除目錄 rmdir dname
rm -r *** -(遞歸刪除該目錄下所有內容,詢問每個准備刪除的文件)
rm -rf ***-(強制刪除該目錄下所有內容,不詢問)
--創建空白文件 touch ***
(ps:從技術的角度來講,linux的文件後綴名沒有任何意義)
--復制 cp
cp -r **1 **2 (復制1到2中)
--移動 mv
mv -t **1 **2 (把2移動到1中)
--編輯文本 vi [文件名]
--查看文本 cat 由第一行開始顯示文本內容
tac 從最後一行顯示,可以看出 tac 是 cat 的倒著寫
more 一頁一頁的顯示文檔內容
less 與 more 類似,可以往前翻頁
head 只看頭幾行
-N(數字,可根據行數顯示)
tail 只看後幾行
-N(數字,可根據行數顯示)
nl 顯示的時候,順序輸出行號
od 以二進制位的方式讀取檔案內容
--查找文本 find [路徑][查找類型][搜索文件名]
如查找rc.local find /etc -name *.local
--查找命令信息及其位置 whereis 命令
如 whereis ls
--查看環境變數 echo $SHELL
如 echo $PATH (分大小寫:分隔符是:,windows是echo %path%;)
--鏈接 ln
如 ln joe.txt a (硬鏈接,如同復制一個新文件,joe.txt刪除後,a還存在)
a是鏈接的名稱,a和joe.txt同步,然後a的內容和joe.txt一樣
joe.txt改變,a也跟著變
如 ln -s joe.txt b (軟鏈接,如同創建一個快捷方式,joe.txt刪除後,b不存在)
--wc 統計指定文本文件的行數、字數、字元數
--grep(很常用) 在指定的文本文件中查找指定的字元串
grep 字元串 文件名
--col 見管道..
--------------------
----信息顯示命令----
--------------------
--date 顯示和設置日期
--stat 顯示指定文件的相關信息
--who、w 顯示在線登錄用戶
--whoami 顯示用戶自己的身份
--id 顯示當前用戶的id信息
--hostname 顯示主機名稱
--uname 顯示操作系統信息
--dmesg 顯示系統啟動信息
-- 顯示指定的文件(目錄)已使用的磁碟空間
--df 顯示文件系統磁碟空間的使用情況
--free 顯示當前內存和交換空間的使用情況
--fdisk -l 顯示磁碟信息
--locale 顯示當前語言環境
5、掛載點(mount 設備目錄 掛載目錄)
--訪問設備 (那設備當成一個文件,和另外一個文件夾進行綁定)
--例如掛載光碟機:步驟 [cd /mnt]---[mkdir cdr]---[mount /dev/cdrom /mnt/cdr]---[cd cdr]--OK!直接訪問光碟機內容
--卸載掛載設備(umount /dev/cdrom)--注意必須先退出掛載目錄,否則出現"device is busy"錯誤.
6、startup-shutdown(linux啟動流程)
--A、boot sequence(important) linux啟動過程
a. load bios(hardware information)
b. read MBR's config to find out the OS
(MBR--Master Boot Record,硬碟第一個物理扇區,柱面0、磁頭0、扇區1,包含主引導程序和硬碟分區表)
c. load the kernel of the OS
(載入為kernel核心的OS)
d. init process starts...
(啟動linux第一個進程init)
e. execute /etc/rc.d/sysinit
(執行系統最重要的配置文件,後台啟用進程)
(rc.d--run command)
f. start other moles(stc/moles.conf)
(開啟各種模塊,如內存管理模塊、硬碟管理模塊)
g. execute the run level scripts
(系統啟動是分層次的,根據情況執行,每個層次之間沒關系)
0 - 系統停機狀態
1 - 單用戶工作狀態 root
2 - 多用戶狀態(沒有NFS)
3 - 多用戶狀態(有NFS)
NFS - Network File System 網路文件系統,聯網系統
4 - 系統未使用,留給用戶
5 - 圖形界面
6 - 系統正常關閉並重新啟動
如:cd /etc -- 有rc0.d、rc1.d、rc2.d、rc3.d、rc4.d、rc5.d等多個文件夾,保存著各個層次執行的進程文件
h. execute /etc/rc.d/rc.local (重要)
(保存其它進程腳本,如tomcat自動啟動,要修改此配置文件)
i. execute /bin/login
(登錄界面)
j. shell started...
7、vi 文本編輯器
--兩種模式:命令模式 編輯模式
--vi [文件名]
(切換到編輯模式)
a append-游標後添加
i insert-游標前插入
o open-另起一行編輯
esc (切換回命令模式)
:w 存檔
:wq 存檔退出
:q 退出
:q! 不存檔退出
dd 刪除其中一行
dw 刪除一個單詞
(sudo gedit 文本 常用linux下的文本編輯器,比vi好用)
8、用戶設置
--切換用戶(switch user) su username
小技巧:直接exit切換
--添加用戶 useradd username [-g] [組名](分配到某個用戶組)
(創建後會自動在/home目錄下創建該新用戶的文件夾,如/home/username)
--設置密碼 passwd username
--cd /etc
--查看用戶信息 more password
如新增的用戶信息:username:x:500:500::/home/username:/bin/bash
第一個數字,代表用戶組,當添加用戶沒有指定用戶組時,系統會創建一個和用戶ID一樣的組ID;
第二個數字:用戶ID號;
用戶的目錄是/home/username;
用戶的SHELL是/bin/bash
(命令--->SHELL[解釋命令]--->kenrel內核)
SHELL有多種類型,如csh、bash(常用)、bsh、ksh、sh(最原始)
--添加用戶組 groupadd groupname
--查看用戶組信息 more group
--刪除用戶組 groupdel groupname
--修改用戶 usermod [-g] [組名] [用戶名]
--刪除用戶 userdel username
然後把/home的文件夾刪除了 rm -rf 文件夾
9、許可權file privilege
--linux把文件的許可權分成四種:r:read w:write x:execute -:none
如:-rw-r--r--
lrwxrwxrwx
drwxr-xr-x
drwxr-xr-x
第一個數字'-'代表文件,其餘是文件夾,後9位分為3組,每組有四種許可權設置rwx-
第一位表示文件所有者
第二位表示和所有者在同一用戶組的用戶
第三位表示不在同一用戶組的用戶許可權
--設置許可權 (隨意應用,靈活組合!)
1、普通用法
--添加許可權 [chmod +x 文件]
如:-rw-r--r-- ---> -rwxr-xr-x
--刪除許可權 [chmod -x 文件]
如:-rwxr-xr-x ---> -rw-r--r--
--給自己添加許可權 [chmod ?+x 文件]
如此類推,組--g,其他人--o
如:chmod u+x -rw-r--r-- ---> -rwxr--r--
chmod g+x -rw-r--r-- ---> -rw-r-xr--
chmod o+x -rw-r--r-- ---> -rw-r--r-x
2、專業用法 chmod 755/777
--原理,八進制轉二進制
如755,111 101 101, rwx r-x r-x
777,111 111 111, rwx rwx rwx
--修改所有者許可權 chown (change owner)
如:chown 原來文件 file1 的所有者是 root,改成joe的
chown joe file1
10、管道(把上一個命令執行的結果交給下一個命令)
--使用方法:
命令1|命令2|命令3......|命令n
--使用舉例
--$ls -Rl /etc | more
(如 ls -Rl /etc (在控制台模式下,無法返回前面過去的信息),因此需要管道執行該查詢,實現分頁的工作, ls -Rl /etc | more)
--$cat /etc/passwd | wc
(顯示文件結果,再數數有多少行)
--$cat /etc/passwd | grep lrj
(顯示文件結果,再查找包含lrj的行)
--#dmesg | grep eth0
(顯示系統啟動的信息,再查找包含eth0的行--真正含義,檢查網卡執行信息是否正常)
--$man bash | col -b > bash.txt
語法:col [-bfx][-l<緩沖區列數>]
補充說明:在許多UNIX說明文件里,都有RLF控制字元。當我們運用shell特殊字元">"和">>",把說明文件的內容輸出成純文本文件時,控制字元會變成亂碼,col指令則能有效濾除這些控制字元。
參數:
-b 過濾掉所有的控制字元,包括RLF和HRLF。
-f 濾除RLF字元,但允許將HRLF字元呈現出來。
-x 以多個空格字元來表示跳格字元。
-l<緩沖區列數> 預設的內存緩沖區有128列,您可以自行指定緩沖區的大小。
--$ls -l | grep "^d"
(用正則表達式篩選出目錄列表中 頭字母為'd' 的內容--目錄)(^是正則表達式開頭部分)
--$ls -l * | grep "^-" | wc -l
(列出目錄列表中 頭字元為'-'的內容--文件,並統計顯示的行數wc -l)
11、其他命令
--wall(warning all) 通知所有人
a.命令替換
如 wall `date`、 cd 'pwd'、mkbootdisk $(uname -r)
b.重定向
重定向輸出:
如 ls > cmd.txt ,把文件寫到cmd.txt,不輸出在控制台
ls >> cmd.txt ,把文件追加寫到cmd.txt
重定向輸入:
如 wall > cmd.txt,把文本內容發給所有人
12、修改系統的默認系統級別
常用3和5
3 - 多用戶狀態(有NFS)
NFS - Network File System 網路文件系統,聯網系統
5 - 圖形界面
PS.設置用戶許可權: sudo chmod 777 目錄
4表示讀,2表示寫,1表示執行.
第一位表示文件所有者,第二位表示和所有者在同一用戶組的用戶,第三位表示不在同一用戶組的用戶許可權.
755表示文件所有者可讀寫,執行.
第二位5表示與所有者在同一用戶組的可讀,可執行,不可寫.
第三位5表示其它組可讀,可執行,不可寫. 轉載於Joewalker在本人空間也有詳細說明
② linux 中tomcat啟動腳本,請解釋。
#!/bin/sh ---- 說明本文件是腳本
darwin=false
case "`uname`" in
CYGWIN*) cygwin=true;;
OS400*) os400=true;;
Darwin*) darwin=true;;
esac
----------------------------這幾行,判斷操作系統類別
while [ -h "$PRG" ] ; do ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`/"$link"
fi
done
-------------------------------------------判斷本腳本是否軟鏈接
if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then
echo "Cannot find $PRGDIR/$EXECUTABLE"
echo "The file is absent or does not have execute permission"
echo "This file is needed to run this program"
exit 1
fi
------------------------------判斷本腳本是否能「執行」,如果不能,退出、提示
exec "$PRGDIR"/"$EXECUTABLE" start "$@" ------運行tomcat,後面的 $@是所有命令行參數
③ Linux下部署tomcat項目部署不了,啟動tomcat也啟動不了
有可能是由於你的tomcat放置的路徑問題.不是路徑錯誤,而是有些路徑要求的許可權比內較高,tomcat啟動和部署容需要執行tomcat的內部程序,如sh文件.那麼來說,你需要對需要啟動的文件進行授權,比如chmod +w +r之類的.還要看你的發行版
④ linux涓嬬殑tomcat鎵句笉鍒伴」鐩錛屾垜鏄鐩存帴鎶婇」鐩甤opy鍦╳ebapps涓嬮潰鐨勶紝tomcat姝e父鍚鍔
1.浣犺寸殑欏圭洰鏄緙栬瘧濂界殑宸ョ▼鍚楋紵鍦╨inux涓嬫斁鐨勬槸鍚﹁窡windows涓嬫斁鐨勫悓涓欏圭洰錛
2.tomcat鍚鍔ㄦe父鍚庯紝鐪嬬湅logs涓嬬殑catalina.log涓鐨勪俊鎮錛屾槸涓嶆槸姝g『鍚鍔ㄤ簡浣犵殑欏圭洰
3.澶囦喚webapps涓嬬殑ROOT鐩褰曪紝娓呯┖ROOT鐩褰曪紝鎶婁綘鐨勯」鐩閲岀殑鍐呭瑰嶅埗鍒癛OOT涓嬶紝鐪嬬湅鑳戒笉鑳芥g『榪愯岋紝璁塊棶鐨勬椂鍊欎笉闇瑕佸啀鍔犻」鐩鍚嶃備緥濡傦細http://涓繪満鍚:絝鍙e彿/login.jsp
⑤ linux怎麼安裝tomcat7
1.JDK的安裝
1. 下載JDK
先查看Linux系統是多少位(32位/64位):getconf LONG_BIT。再從JDK官網(http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html)下載JDK 7,Linux 64位下載jdk-7u60-linux-x64.tar.gz。
2. 解壓安裝
2.1選擇安裝JDK的位置/usr/Java,如果存在這個目錄無需創建,一般新到的機器是沒有這個目錄的,這個我們創建這個目錄。
[java] view plain print?
sudo mkdir /usr/java
2.2將jdk-7u60-linux-x64.tar.gz上傳到伺服器,移動到/usr/java。
[java] view plain print?
sudo mv jdk-7u60-linux-x64.gz /usr/java
2.3解壓:進入/usr/java目錄(cd usr/java)解壓
[java] view plain print?
sudo tar -zxvfjdk-7u60-linux-x64.gz
2.4刪除jdk-7u60-linux-x64.tar.gz
3. 配置環境變數
⑥ 「圖文結合」Linux 進程、線程、文件描述符的底層原理
開發十年經驗總結,阿里架構師的手寫Spring boot原理實踐文檔
阿里架構師的這份:Redis核心原理與應用實踐,帶你手撕Redis
Tomcat結構原理詳解
說到進程,恐怕面試中最常見的問題就是線程和進程的關系了,那麼先說一下答案: 在 Linux 系統中,進程和線程幾乎沒有區別 。
Linux 中的進程其實就是一個數據結構,順帶可以理解文件描述符、重定向、管道命令的底層工作原理,最後我們從操作系統的角度看看為什麼說線程和進程基本沒有區別。
首先,抽象地來說,我們的計算機就是這個東西:
這個大的矩形表示計算機的 內存空間 ,其中的小矩形代表 進程 ,左下角的圓形表示 磁碟 ,右下角的圖形表示一些 輸入輸出設備 ,比如滑鼠鍵盤顯示器等等。另外,注意到內存空間被劃分為了兩塊,上半部分表示 用戶空間 ,下半部分表示 內核空間 。
用戶空間裝著用戶進程需要使用的資源,比如你在程序代碼里開一個數組,這個數組肯定存在用戶空間;內核空間存放內核進程需要載入的系統資源,這一些資源一般是不允許用戶訪問的。但是注意有的用戶進程會共享一些內核空間的資源,比如一些動態鏈接庫等等。
我們用 C 語言寫一個 hello 程序,編譯後得到一個可執行文件,在命令行運行就可以列印出一句 hello world,然後程序退出。在操作系統層面,就是新建了一個進程,這個進程將我們編譯出來的可執行文件讀入內存空間,然後執行,最後退出。
你編譯好的那個可執行程序只是一個文件,不是進程,可執行文件必須要載入內存,包裝成一個進程才能真正跑起來。進程是要依靠操作系統創建的,每個進程都有它的固有屬性,比如進程號(PID)、進程狀態、打開的文件等等,進程創建好之後,讀入你的程序,你的程序才被系統執行。
那麼,操作系統是如何創建進程的呢? 對於操作系統,進程就是一個數據結構 ,我們直接來看 Linux 的源碼:
task_struct 就是 Linux 內核對於一個進程的描述,也可以稱為「進程描述符」。源碼比較復雜,我這里就截取了一小部分比較常見的。
我們主要聊聊 mm 指針和 files 指針。 mm 指向的是進程的虛擬內存,也就是載入資源和可執行文件的地方; files 指針指向一個數組,這個數組里裝著所有該進程打開的文件的指針。
先說 files ,它是一個文件指針數組。一般來說,一個進程會從 files[0] 讀取輸入,將輸出寫入 files[1] ,將錯誤信息寫入 files[2] 。
舉個例子,以我們的角度 C 語言的 printf 函數是向命令行列印字元,但是從進程的角度來看,就是向 files[1] 寫入數據;同理, scanf 函數就是進程試圖從 files[0] 這個文件中讀取數據。
每個進程被創建時, files 的前三位被填入默認值,分別指向標准輸入流、標准輸出流、標准錯誤流。我們常說的「文件描述符」就是指這個文件指針數組的索引 ,所以程序的文件描述符默認情況下 0 是輸入,1 是輸出,2 是錯誤。
我們可以重新畫一幅圖:
對於一般的計算機,輸入流是鍵盤,輸出流是顯示器,錯誤流也是顯示器,所以現在這個進程和內核連了三根線。因為硬體都是由內核管理的,我們的進程需要通過「系統調用」讓內核進程訪問硬體資源。
PS:不要忘了,Linux 中一切都被抽象成文件,設備也是文件,可以進行讀和寫。
如果我們寫的程序需要其他資源,比如打開一個文件進行讀寫,這也很簡單,進行系統調用,讓內核把文件打開,這個文件就會被放到 files 的第 4 個位置,對應文件描述符 3:
明白了這個原理, 輸入重定向 就很好理解了,程序想讀取數據的時候就會去 files[0] 讀取,所以我們只要把 files[0] 指向一個文件,那麼程序就會從這個文件中讀取數據,而不是從鍵盤:
同理, 輸出重定向 就是把 files[1] 指向一個文件,那麼程序的輸出就不會寫入到顯示器,而是寫入到這個文件中:
錯誤重定向也是一樣的,就不再贅述。
管道符其實也是異曲同工,把一個進程的輸出流和另一個進程的輸入流接起一條「管道」,數據就在其中傳遞,不得不說這種設計思想真的很巧妙:
到這里,你可能也看出「Linux 中一切皆文件」設計思路的高明了,不管是設備、另一個進程、socket 套接字還是真正的文件,全部都可以讀寫,統一裝進一個簡單的 files 數組,進程通過簡單的文件描述符訪問相應資源,具體細節交於操作系統,有效解耦,優美高效。
首先要明確的是,多進程和多線程都是並發,都可以提高處理器的利用效率,所以現在的關鍵是,多線程和多進程有啥區別。
為什麼說 Linux 中線程和進程基本沒有區別呢,因為從 Linux 內核的角度來看,並沒有把線程和進程區別對待。
我們知道系統調用 fork() 可以新建一個子進程,函數 pthread() 可以新建一個線程。 但無論線程還是進程,都是用 task_struct 結構表示的,唯一的區別就是共享的數據區域不同 。
換句話說,線程看起來跟進程沒有區別,只是線程的某些數據區域和其父進程是共享的,而子進程是拷貝副本,而不是共享。就比如說, mm 結構和 files 結構在線程中都是共享的,我畫兩張圖你就明白了:
所以說,我們的多線程程序要利用鎖機制,避免多個線程同時往同一區域寫入數據,否則可能造成數據錯亂。
那麼你可能問, 既然進程和線程差不多,而且多進程數據不共享,即不存在數據錯亂的問題,為什麼多線程的使用比多進程普遍得多呢 ?
因為現實中數據共享的並發更普遍呀,比如十個人同時從一個賬戶取十元,我們希望的是這個共享賬戶的余額正確減少一百元,而不是希望每人獲得一個賬戶的拷貝,每個拷貝賬戶減少十元。
當然,必須要說明的是, 只有 Linux 系統將線程看做共享數據的進程 ,不對其做特殊看待 ,其他的很多操作系統是對線程和進程區別對待的,線程有其特有的數據結構,我個人認為不如 Linux 的這種設計簡潔,增加了系統的復雜度。
在 Linux 中新建線程和進程的效率都是很高的,對於新建進程時內存區域拷貝的問題,Linux 採用了 -on-write 的策略優化,也就是並不真正復制父進程的內存空間,而是等到需要寫操作時才去復制。 所以 Linux 中新建進程和新建線程都是很迅速的 。