1、文件和目錄:
# cd /home? ? ? ? ? ? ? ? ? ? ? ? 進入 '/home' 目錄
# cd ..? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回上一級目錄
# cd ../..? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回上兩級目錄
# cd -? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 返回上次所在目錄
# cp file1 file2? ? ? ? ? ? ? ? ? ? 將file1復制為file2
# cp -a dir1 dir2? ? ? ? ? ? ? ? 復制一個目錄
# cp -a /tmp/dir1 .? ? ? ? ? ? ? 復制一個目錄到當前工作目錄(.代表當前目錄)
# ls? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查看目錄中的文件
# ls -a? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示隱藏文件
# ls -l? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示詳細信息
# ls -lrt? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 按時間顯示文件(l表示詳細列表,r表示反向排序,t表示按時間排序)
# pwd? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示工作路徑
# mkdir dir1? ? ? ? ? ? ? ? ? ? ? 創建 'dir1' 目錄
# mkdir dir1 dir2? ? ? ? ? ? ? ? 同時創建兩個目錄
# mkdir -p /tmp/dir1/dir2? ? 創建一個目錄樹
# mv dir1 dir2? ? ? ? ? ? ? ? ? ? 移動/重命名一個目錄
# rm -f file1? ? ? ? ? ? ? ? ? ? ? ? 刪除 'file1'
# rm -rf dir1? ? ? ? ? ? ? ? ? ? ? 刪除 'dir1' 目錄及其子目錄內容
2、查看文件內容:
# cat file1? ? ? ? ? ? ? ? ? ? ? ? ? 從第一個字節開始正向查看文件的內容
# head -2 file1? ? ? ? ? ? ? ? ? 查看一個文件的前兩行
# more file1? ? ? ? ? ? ? ? ? ? ? 查看一個長文件的內容
# tac file1? ? ? ? ? ? ? ? ? ? ? ? ? 從最后一行開始反向查看一個文件的內容
# tail -3 file1? ? ? ? ? ? ? ? ? ? ? 查看一個文件的最后三行
3、文本處理:
# grep str /tmp/test? ? ? ? ? ? 在文件 '/tmp/test' 中查找 "str"
# grep ^str /tmp/test? ? ? ? ? 在文件 '/tmp/test' 中查找以 "str" 開始的行
# grep [0-9] /tmp/test? ? ? ? 查找 '/tmp/test' 文件中所有包含數字的行
# grep str -r /tmp/*? ? ? ? ? ? 在目錄 '/tmp' 及其子目錄中查找 "str"
# diff file1 file2? ? ? ? ? ? ? ? ? 找出兩個文件的不同處
# sdiff file1 file2? ? ? ? ? ? ? ? 以對比的方式顯示兩個文件的不同
awk 命令,文本處理神器
# awk '{print $1, $4}' netstat.txt? ? ? ? 打印出netstat.txt中的第一列和第四列
其中單引號中的被大括號括著的就是awk的語句,注意,其只能被單引號包含。
其中的$1..$n表示第幾例。注:$0表示整個行。
#awk '{printf "%-8s %-8s %-8s %-18s %-22s %-15s\n",$1,$2,$3,$4,$5,$6}' netstat.txt? ? 按格式輸出各列,和C語言的printf差不多
https://coolshell.cn/articles/9070.html
4、查找:
# find / -name file1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 從 '/' 開始進入根文件系統查找文件和目錄
# find / -user user1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 查找屬于用戶 'user1' 的文件和目錄
# find /home/user1 -name \*.bin? ? ? ? ? ? ? ? ? ? ? ?在目錄 '/ home/user1' 中查找以 '.bin' 結尾的文件
# find /usr/bin -type f -atime +100? ? ? ? ? ? ? ? ? ? ? ? 查找在過去100天內未被使用過的執行文件
# find /usr/bin -type f -mtime -10? ? ? ? ? ? ? ? ? ? ? ? ? 查找在10天內被創建或者修改過的文件
# find -name \*.c | xargs grep -E 'expr'????在當前目錄及其子目錄所有.c結尾的文件中查找 'expr'
# find -name '*.[ch]' | xargs grep -E 'expr'? ? ? 在當前目錄及其子目錄所有.c和.h文件中查找 'expr'
# find -type f -print0 | xargs -r0 grep -F 'expr'? ? ?在當前目錄及其子目錄的常規文件中查找 'expr'
# find -maxdepth 1 -type f | xargs grep -F 'expr'? ? 在當前目錄中查找 'expr'
# locate \*.ps? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 尋找以 '.ps' 結尾的文件,先運行 'updatedb' 命令
locate(locate) 命令用來查找文件或目錄。 locate命令要比find -name快得多,原因在于它不搜索具體目錄,而是搜索一個數據庫/var/lib/mlocate/mlocate.db 。這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,并且每天自動更新一次,因此,我們在用whereis和locate 查找文件時,有時會找到已經被刪除的數據,或者剛剛建立文件,卻無法查找到,原因就是因為數據庫文件沒有被更新。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。整個locate工作其實是由四部分組成的:
/usr/bin/updatedb? 主要用來更新數據庫,通過crontab自動完成的
/usr/bin/locate? ? ? ? 查詢文件位置
/etc/updatedb.conf? updatedb的配置文件
/var/lib/mlocate/mlocate.db? 存放文件信息的文件
whereis (whereis) 命令用來定位指令的二進制程序、源代碼文件和man手冊頁等相關文件的路徑。whereis命令只能用于程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。如果省略參數,則返回所有信息。
5、壓縮和解壓:
# bzip2 file1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 壓縮 file1
# bunzip2 file1.bz2? ? ? ? ? ? ? ? ? ? ? ? 解壓 file1.bz2
# gzip file1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 壓縮 file1
# gzip -9 file1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 最大程度壓縮 file1
# gunzip file1.gz? ? ? ? ? ? ? ? ? ? ? ? ? ? 解壓 file1.gz
# tar -cvf archive.tar file1? ? ? ? ? ? ? 把file1打包成 archive.tar
(-c: 建立壓縮檔案;-v: 顯示所有過程;-f: 使用檔案名字,是必須的,是最后一個參數;-x:解打包)
# tar -cvf archive.tar file1 dir1? ? ? ? 把 file1,dir1 打包成 archive.tar
# tar -zcvf archive.tar.gz file1 dir1? ? ? ? 把 file1,dir1 打包并壓縮成 archive.tar.gz
# tar -tf archive.tar? ? ? ? ? ? ? ? ? ? ? ? 顯示一個包中的內容
# tar -xvf archive.tar? ? ? ? ? ? ? ? ? ? ? 解打包
# tar -zxvf archive.tar? ? ? ? ? ? ? ? ? ? ? 先解壓縮然后解打包
# tar -xvf archive.tar -C /tmp? ? ? ? 把壓縮包釋放到 /tmp目錄下
# zip file1.zip file1? ? ? ? ? ? ? ? ? ? ? ? ? 創建一個zip格式的壓縮包
# zip -r file1.zip file1 dir1? ? ? ? ? ? ? 把文件和目錄壓縮成一個zip格式的壓縮包
# unzip file1.zip? ? ? ? ? ? ? ? ? ? ? ? ? ? 解壓一個zip格式的壓縮包到當前目錄
# unzip test.zip -d /tmp/? ? ? ? ? ? ? ? 解壓一個zip格式的壓縮包到 /tmp 目錄
6、yum工具:
# yum -y install [package]? ? ? ? ? ? ? 下載并安裝一個rpm包,-y是自動選擇yes確認是這個包要安裝。不加-y還要手動確認
# yum local install [package.rpm]? ? 安裝一個rpm包,使用你自己的軟件倉庫解決所有依賴關系
# yum -y update? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 更新當前系統中安裝的所有rpm包
# yum update [package]? ? ? ? ? ? ? ? 更新一個rpm包
# yum remove [package]? ? ? ? ? ? ? ? 刪除一個rpm包
# yum list? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 列出當前系統中安裝的所有包
# yum search [package]? ? ? ? ? ? ? ? 在rpm倉庫中搜尋軟件包
# yum clean [package]? ? ? ? ? ? ? ? ? 清除緩存目錄(/var/cache/yum)下的軟件包
# yum clean headers? ? ? ? ? ? ? ? ? ? ? 刪除所有頭文件
# yum clean all? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 刪除所有緩存的包和頭文件
上面是centos操作系統。若是ubuntu操作系統,則用apt-get 命令代替yum命令來安裝軟件。
7、網絡:
# ifconfig eth0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示一個以太網卡的配置
# ifconfig eth0 192.168.1.1 netmask 255.255.255.0? ? ? ? ? ? 配置網卡的IP地址
# ifdown eth0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 禁用 'eth0' 網絡設備
# ifup eth0? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 啟用 'eth0' 網絡設備
# iwconfig eth1? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示一個無線網卡的配置
# iwlist scan? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示無線網絡
# ip addr show? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示網卡的IP地址
8、其他:
# su -? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 切換到root權限(與# su有區別)su與su -命令是有著本質區別
(前者只是切換了root身份,但Shell環境仍然是普通用戶的Shell;而后者連用戶和Shell環境一起切換成root身份了。只有切換了Shell環境才不會出現PATH環境變量錯誤。su切換成root用戶以后,pwd一下,發現工作目錄仍然是普通用戶的工作目錄;而用su -命令切換以后,工作目錄變成root的工作目錄了。)
# shutdown -h now? ? ? ? ? 關機
# shutdown -r now? ? ? ? ? ? 重啟
# top? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 羅列使用CPU資源最多的linux任務 (輸入q或者快捷鍵ctrl+c退出)
#iostat????????(I/O statistics 輸入/輸出統計) 命令對系統的磁盤操作活動進行監視。它的特點是匯報磁盤活動統計情況,同時也會匯報出CPU使用情況
# pstree? ? ? ? ? ? ? ? ? ? ? ? ? ? 以樹狀圖顯示程序
# man ping? ? ? ? ? ? ? ? ? ? ? ? 查看manual參考手冊(例如ping 命令)
# passwd? ? ? ? ? ? ? ? ? ? ? ? ? 修改密碼
# df -h? ? ? ? ? ? ? ? ? ? ? ? ? ? ? disk free顯示磁盤的使用情況
#du -ah [目錄/文件]? ? ? ???(Disk usage) 用來計算每個文件的磁盤用量,目錄則取總用量。省略目錄/文件,則是當前文件。參數-a是指all所有文件,-h是指human即按照人性化的方式顯示文件大小(單位K,M,G)?
# cal -3? ? ? ? ? ? ? ? ? ? ? ? ? ? 顯示前一個月,當前月以及下一個月的月歷
# cal 10 1988? ? ? ? ? ? ? ? ? 顯示指定月,年的月歷
# date --date '1970-01-01 UTC 1427888888 seconds'? 把一相對于1970-01-01 00:00的秒數轉換成時間
#link 源文件名 目標文件名? ? ? ? (link也可省略為ln)硬鏈接,inode文件唯一標識符不變,內存不變,只是多一個文件名(便于人閱讀的文件名,實際linux系統中都是使用inode號去指向一塊內存來保存文件數據)。
#link -s 原文件名 目標文件名? ? ?軟鏈接,會新增一個inode,只是指向的內存數據是保存的原inode,相當于windows下的一個快捷方式。
#ls -i? ? ? ? i表示inode,表示列出當前目錄下所有文件的inode號
cp命令會新增inode號,mv命令不新增inode號,rm命令先刪除文件名減少鏈接數目,當鏈接數目=0時再清空內存塊數據并釋放inode號給系統用于下一次指向新的文件。
9.1、輸出重定向
把其他命令運行后本應該打印顯示在屏幕上的內容,保存到指定的文件中去,不顯示在屏幕上。
(1)標準輸出重定向,只在命令執行正確后保存運行結果到文件中
????????????#ifconfig > test.log? ? ? ? (創建新文件或者完全覆蓋舊文件)
????????????#ifconfig >> test.log? ? ? ? (不覆蓋內容,會在后面追加內容)
(2)命令運行錯誤時保存到文件
? ? ? ? ????#命令 2> error.log? ?(或者追加內容 #命令 2>> error.log)
(3)正確和錯誤的都保存到文件
? ? ? ? ? ? ?#命令 &> test.log? ? ?(或者追加內容 #命令 &>> test.log)
? (4)如果命令正確運行輸出到文件1,錯誤則輸出到文件2
????????????#命令 > 文件1 2>文件2? ? (或者追加內容 #命令 >> 文件1 2>>文件2)
9.2、輸入重定向
從文件或鍵盤輸入字符串,作為前面命令執行需要的輸入數據
# wc < 文件名? ? ? ? (wc命令,用于統計文件內字符行數[-l],單詞數[-w],字符數。不加參數就是默認3個都統計)
# wc << 輸入字符串?
9.3、管道符,多命令連接執行
(1)多命令順序執行
? ? ? ? #命令1 ;命令2? ? ? ? (前面命令的輸出不顯示到屏幕上,只有最后一個命令的輸出才顯示)
(2)多命令依條件判斷是否接著執行
? ? ? ? #命令1 && 命令2? ? ? ? (邏輯與,即命令1正確執行后才會執行命令2)
????????#命令1? ||? 命令2? ? ? ? (邏輯或,即命令1錯誤執行才會執行命令2)
? ? ? ? #命令 && echo yes? ||? echo no? ? (命令執行正確打印yes,錯誤執行打印no)
(3)管道符"|",命令的正確輸出結果不打印顯示到屏幕上,而是作為后面命令的輸入
????????#命令1 |? 命令2????????
? ? ? ? 例如:
? ? ? ? #netstat -an | grep ESTABLISHED? ? ? ? (先查看所有的網絡連接和端口使用情況,然后用grep命令篩選出現 ESTABLISHED字符串的那些行,也就是只顯示已建立連接的TCP端口)
? ??????#netstat -an | grep ESTABLISHED | wc -l? ? ? ? (再用wc命令統計出已連接的TCP端口數量,最后只在屏幕打印輸出一個數字)
? ? ? ? #ps aux | grep freeswitch? ? 或? ? #ps -ef | grep freeswitch (兩者都會先列出所有的進程,然后打印出和freeswitch相關的進程,然后我們可以看到進程號pid,就可以輕松的根據pid來執行kill -9 pid號 結束進程)
PS的aux和-ef參數的區別
一直以為ps aux就可以列出所有的在運行進程,最近發現還是有些缺陷,用ps aux和-ef得到的結果居然不一樣,以后盡量用-ef參數吧。
情況是這樣的,我用/bmrt/blaph/blaph/bmgctl來啟動進程,由于ps aux是用BSD格式來顯示結果,所以可能只會顯示到/bmrt/blaph/blap,后面的都被截掉了。
這樣,如果用ps aux | grep bmgctl 來過濾該進程,可能就會誤傷,獲取不到bmgctl進程。
而ps -ef是用全格式的System V格式,顯示出來就是帶全路徑的進程名,會顯示出bmgctl,在ps -ef | grep bmgctl命令下就可以完整顯示該進程了。
——也就是說,用ps -ef更安全,ps aux可能顯示的一行內容太長而會截斷字符串,導致grep查找不到匹配的字符串而出錯。
常用快捷鍵:
? ? ? CentOS 6.4 帶圖形界面系統中可以通過系統->首選項->鍵盤快捷鍵來設置快捷鍵。例如可將運行終端的快捷鍵設為Ctrl+Alt+T。
Ctrl + u? ? ? ? ? ? 刪除光標之前到行首的字符
Ctrl + k? ? ? ? ? ? 刪除光標之前到行尾的字符
Ctrl + c? ? ? ? ? ? 取消當前行輸入的命令,相當于Ctrl + Break
Ctrl + a? ? ? ? ? ? 光標移動到行首(ahead of line),相當于通常的Home鍵
Ctrl + e? ? ? ? ? ? 光標移動到行尾(end of line)
Ctrl + f? ? ? ? ? ? 光標向前(forward)移動一個字符位置
Ctrl + b? ? ? ? ? ? 光標往回(backward)移動一個字符位置
Ctrl + l? ? ? ? ? ? 清屏,相當于執行clear命令
Ctrl + r? ? ? ? ? ? 顯示:號提示,根據用戶輸入查找相關歷史命令(reverse-i-search)
Ctrl + w? ? ? ? ? 刪除從光標位置前到當前所處單詞(word)的開頭
Ctrl + t? ? ? ? ? ? 交換光標位置前的兩個字符
Ctrl + y? ? ? ? ? ? 粘貼最后一次被刪除的單詞
Ctrl + Alt + d? 顯示桌面
Alt + b? ? ? ? ? ? 光標往回(backward)移動到前一個單詞
Alt + d? ? ? ? ? ? 刪除從光標位置到當前所處單詞的末尾
Alt + F2? ? ? ? ? 運行
Alt + F4? ? ? ? ? 關閉當前窗口
Alt + F9? ? ? ? ? 最小化當前窗口
Alt + F10? ? ? ? 最大化當前窗口
Alt + Tab? ? ? ? 切換窗口
Alt +按住左鍵? 移動窗口(或在最下面的任務欄滾動鼠標滑輪)
[鼠標中間鍵] 粘貼突出顯示的文本。使用鼠標左鍵來選擇文本。把光標指向想粘貼文本的地方。點擊鼠標中間鍵來粘貼。
[Tab] 命令行自動補全。使用 shell 提示時可使用這一方式。鍵入命令或文件名的前幾個字符,然后按 [Tab] 鍵,它會自動補全命令或顯示匹配鍵入字符的所有命令。
在桌面或文件管理器中直接按 / 就可以輸入位置,打開文件管理器。
快速搜索:在 vi 、vim或 Firefox 中直接按 / 即可進入搜索狀態。
網站鏈接和圖片可直接拖放到桌面或者目錄,可以馬上下載。
直接將文件管理器中的文件拖到終端中就可以在終端中得到完整的路徑名。
在滾動條的空白處點擊鼠標中鍵,屏幕即滾動到那個地方。
10、殺死進程或者占用某個端口的進程
1、查找某個端口(比如8888)被哪個程序的進程占用。lsof(list open files)是一個列出當前系統打開文件的工具,需要root權限。在linux環境下,任何事物都以文件的形式存在,通過文件不僅僅可以訪問常規數據,還可以訪問網絡連接和硬件。lsof 常見的用法是查找應用程序打開的文件的名稱和數目。可用于查找出某個特定應用程序將日志數據記錄到何處,或者正在跟蹤某個問題。
[root@centos ~]# lsof -i:8888????????????lsof -i 用以顯示符合條件的進程情況
COMMAND? ? PID USER? FD? TYPE DEVICE SIZE/OFF NODE NAME
freeswitch 4982 root? 69u? IPv4? 21544? ? ? 0t0? UDP *:ddi-udp-1
freeswitch 4982 root? 76u? IPv4? 21545? ? ? 0t0? TCP *:ddi-tcp-1 (LISTEN)
另一種方法:
[root@centos mod_esl_json]# netstat -tunlp | grep 8888
tcp? ? ? ? 0? ? ? 0 0.0.0.0:8888? ? ? ? ? ? ? ? 0.0.0.0:*? ? ? ? ? ? ? ? ? LISTEN? ? ? 4982/freeswitch
udp? ? ? ? 0? ? ? 0 0.0.0.0:8888? ? ? ? ? ? ? ? 0.0.0.0:*? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 4982/freeswitch
另一個命令:(能看到某個端口的狀態,不能看到進程號pid值)
[root@centos ~]# netstat -an |grep 8888
tcp? ? ? ? 0? ? ? 0 0.0.0.0:8888? ? ? ? ? ? ? ? 0.0.0.0:*? ? ? ? ? ? ? ? ? LISTEN
tcp? ? ? ? 0? ? ? 0 192.168.0.106:8888? ? ? ? ? 192.168.0.108:15423? ? ? ? TIME_WAIT
tcp? ? ? ? 0? ? ? 0 192.168.0.106:8888? ? ? ? ? 192.168.0.108:15441? ? ? ? ESTABLISHED
udp? ? ? ? 0? ? ? 0 0.0.0.0:8888? ? ? ? ? ? ? ? 0.0.0.0:*
2、比如 先查看 httpd 程序的進程
ps aux |grep httpd
[root@moyea309 init.d]# ps aux |grep httpd
root? ? ? 2091? 0.0? 0.1? 5488? 2832 ?? ? ? ? Ss? 17:19? 0:00 /web/apache//bin/httpd -k restart
daemon? ? 2475? 0.0? 0.1 283220? 2256 ?? ? ? ? Sl? 17:45? 0:00 /web/apache//bin/httpd -k restart
daemon? ? 2476? 0.0? 0.1 283220? 2260 ?? ? ? ? Sl? 17:45? 0:00 /web/apache//bin/httpd -k restart
daemon? ? 2477? 0.0? 0.1 283220? 2260 ?? ? ? ? Sl? 17:45? 0:00 /web/apache//bin/httpd -k restart
root? ? ? 2738? 0.0? 0.0? 5500? 736 pts/0? ? S+? 17:56? 0:00 grep httpd
這個就是 apache 的所有進程
我們可以用? kill -9 加進程ID? 如下
[root@moyea309 init.d]# kill -9 2091
[root@moyea309 init.d]# kill -9 2475
[root@moyea309 init.d]# kill -9 2476
[root@moyea309 init.d]# kill -9 2477
[root@moyea309 init.d]# ps aux |grep httpd
root? ? ? 2740? 0.0? 0.0? 5500? 732 pts/0? ? S+? 17:58? 0:00 grep httpd
全部殺完了...? 殺死進程方法有很多種,,,,,我這個 只是其中的一種
# killall (-9) NAME? ? 可以根據程序NAME名字殺死進程,但名字必須完全匹配。(-9)可選
查看當前正在運行的snmp相關進程# ps –ef | grep snmp,然后可以殺死對應的進程。
11、修改環境變量
查看PATH:echo $PATH
以添加mongodb server為列
修改方法一:
export PATH=/usr/local/mongodb/bin:$PATH
//配置完后可以通過echo $PATH查看配置結果。
生效方法:立即生效
有效期限:臨時改變,只能在當前的終端窗口中有效,當前窗口關閉后就會恢復原有的path配置
用戶局限:僅對當前用戶
修改方法二:
通過修改.bashrc文件:
vim ~/.bashrc
//在最后一行添上:
export PATH=/usr/local/mongodb/bin:$PATH
生效方法:(有以下兩種)
1、關閉當前終端窗口,重新打開一個新終端窗口就能生效
2、輸入“source ~/.bashrc”命令,立即生效
有效期限:永久有效
用戶局限:僅對當前用戶
修改方法三:
通過修改profile文件:
vim /etc/profile
/export PATH //找到設置PATH的行,添加(vim的“/”是搜索后面帶的字符串的意思)
export PATH=/usr/local/mongodb/bin:$PATH
生效方法:系統重啟
有效期限:永久有效
用戶局限:對所有用戶
修改方法四:
通過修改environment文件:
vim /etc/environment
在PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"中加入“:/usr/local/mongodb/bin”
生效方法:系統重啟
有效期限:永久有效
用戶局限:對所有用戶
12、service命令相關
控制系統服務的實用工具,可以啟動、停止、重新啟動和關閉系統服務,還可以顯示所有系統服務的當前狀態。
# service?--status-all? ? 顯示/etc/init.d/下所有服務的狀態(該目錄下每個腳本文件是一個服務auditd functions ip6tables killall netconsole?network?rdisc? rsyslog? saslauthd? sshd? udev-post? crond? halt? iptables? messagebus? netfs? postfix? restorecond? sandbox single svnserve)
# service 服務名 status/stop/start/restart? ? 服務名就是腳本文件名
常用的有:iptables(防火墻)? network(網絡設備)
# service iptables stop? ?關閉防火墻
# service network status? ? ? ? 查看網絡設備的狀態
# service network stop/start/restart??關閉所有網絡設備(斷網)/打開網絡設備聯網/重新聯網
13、Linux下添加開機自啟動服務,使service xxx命令能直接執行
1.按一定的規則編寫服務腳本,比如:myserviced
#!/bin/bash?
#chkconfig: 2345 80 05? ? ? ?
#description: myservice?
#?“#”號后面的都是注釋。第一行默認不能變
case $1 in?
start)?
? ? echo "myservice startup"? ? ? ? #將該行替換成你自己的服務啟動命令?
? ? ;;?
stop)?
? ? echo "myservice stop"? ? ? ? ? ? #將該行替換成你自己服務的啟動命令?
? ? ;;?
restart)?
? ? echo "myservice stop"? ? ? ? ? ? ? ?#...?
? ? echo "myservice startup"? ? ? ? ? ?#...?
? ? ;;?
*)?
? ? ;;?
esac?
命令解析:
# chkconfig: 2345 80 5
2345表示服務的運行級別,80代表Start的順序,05代表Kill(Stop)的順序;
# description: service_description????該服務的描述
2.將編寫的腳本放到/etc/init.d/,將myserviced的訪問權限加上“可執行”
chmod +x myserviced?
3.增加服務
chkconfig --add myserviced? ? ? ? ?如此,該服務就可以開機自啟動了
4.啟停服務
service myserviced start?
service myserviced stop?
服務添加完成
可以用:chkconfig --list查看當前系統的服務
可以用:chkconfig --del myserviced刪除服務
14、使用rpm包安裝程序
如安裝gdb,先下載好gdb的rpm包放到某個目錄,然后運行:
rpm -ivh gdb-7.2-92.el6.x86_64.rpm
就安裝gdb程序成功了。
15、shell腳本編寫
1、$vim hello.sh? ? ? ? ? ? 打開編輯腳本文件
????? ??#!bin/bash? ? ? ? ? ? ? ? 腳本文件開頭必須寫這一行
? ? ????腳本文件中每一行命令可以和在普通shell命令行敲的一樣
2、退出vim編輯,保存腳本文件。
3、賦予腳本文件可執行權限
? ? #chmod 777 hello.sh? ? ? ? ? ? (777是所有用戶都有權限執行,775是只有當前用戶有權限執行)
4、執行腳本文件
? ? #./hello.sh? ? ? ? (當前文件夾,直接./執行,也可寫全路徑則可在任意目錄下執行)
注:也可跳過3、4,直接用#bash hello.sh 直接執行(注意若不是當前目錄則要用hello.sh的全路徑)
16、使用gcc編譯C語言源程序,g++編譯C++源程序
(后綴為.c的,gcc把它當作是C程序,而g++當作是c++程序;后綴為.cpp的,兩者都會認為是c++程序,注意,雖然c++是c的超集,但是兩者對語法的要求是有區別的。編譯階段,g++會調用gcc,對于c++代碼,兩者是等價的,但是因為gcc命令不能自動和C++程序使用的庫聯接,所以通常用g++來完成鏈接,為了統一起見,干脆編譯/鏈接統統用g++了,這就給人一種錯覺,好像cpp程序只能用g++似的(當然最好就用g++)。)
我們用gcc編譯程序時,常常會用到“-I”(大寫i),“-L”(大寫l),“-l”(小寫l)等參數,下面做個記錄:例:
gcc -o hello hello1.c hello2.c hello3.c -I/home/hello/include -L/home/hello/lib -lworld
這條命令運行后,會在當前文件夾下產生一個hello文件,這個文件就是可執行文件(類似windows的hello.exe),在當前文件執行命令./hello,即可運行該文件,也就是運行后面三個C源文件。-o即out指定輸出文件名。
上面這句表示在編譯hello.c時:(如果有多個.c源文件聯合編譯,連著寫就行。)
-I/home/hello/include,表示將/home/hello/include目錄作為第一個尋找源代碼中引入的頭文件的目錄,尋找的順序是:/home/hello/include–>/usr/include–>/usr/local/include,也就是指定優先查找的目錄,找不到的話查找默認目錄。如果沒有-I相關的指定,那么就是省略頭文件位置默認為當前文件夾。
-L/home/hello/lib,表示將/home/hello/lib目錄作為第一個尋找庫文件的目錄, 尋找的順序是:/home/hello/lib–>/lib–>/usr/lib–>/usr/local/lib,同上,也是指定優先查找的目錄,如果省略就是指當前文件夾優先。
-lword , 表示**尋找具體的動態鏈接庫文件**libword.so(也就是文件名去掉前綴和后綴所代表的庫文件),如果加上編譯選項-static,表示尋找靜態鏈接庫文件,也就是libword.a。
當然也可以直接把連接庫文件的全路徑放過來,比如用/home/hello/lib/libword.a來代替-L/home/hello/lib -lworld。
當要使用靜態的程序庫時,連接器會找出程序所需的函數,然后將它們拷貝到執行文件,由于這種拷貝是完整的,所以一旦連接成功,靜態程序庫也就不再需要了。然 而,對動態庫而言,就不是這樣。動態庫會在執行程序內留下一個標記指明當程序執行時,首先必須載入這個庫。由于動態庫節省空間,linux下進行連接的缺省操作是首先連接動態庫,也就是說,如果同時存在靜態和動態庫,不特別指定的話,將與動態庫相連接。
對于第三方提供的動態鏈接庫(.so),一般將其拷貝到一個lib目錄下(/usr/local/lib),或者使用-L來指定其所在目錄, 然后使用-l來指定其具體名稱。
?現在假設有一個叫hello的程序開發包,它提供一個靜態庫libhello.a?一個動態庫libhello.so,一個頭文件hello.h,頭文件中提供sayhello()這個函數 void sayhello(); 另外還有一些說明文檔。
這一個典型的程序開發包結構 與動態庫連接, linux默認的就是與動態庫連接,下面這段程序testlib.c使用hello庫中的sayhello()函數
int main()
{
sayhello();
return 0;
}
使用如下命令進行編譯 $gcc -c testlib.c? ? ?,在當前文件夾得到鏈接文件testlib.o,無論靜態庫.a,還是動態庫.so,都是由.o文件創建的。
再用如下命令連接: $gcc -o test testlib.o -lhello? ? ? ? ,在當前文件夾得到可執行文件test。
上面兩步可以一步到位:$gcc -o test testlib.c -lhello? ? ? ? (libhello.so動態庫文件放在當前目錄)
https://www.cnblogs.com/yaozhongxiao/archive/2012/03/16/2400473.html
查看詳細介紹如何用.o文件創建靜態庫.a和動態庫.so文件。
17、gdb調試C/C++程序方法
一般來說GDB主要調試的是C/C++的程序。要調試C/C++的程序,首先在編譯時,我們必須要把調試信息加到可執行文件中。使用編譯器(cc/gcc/g++)的 -g 參數可以做到這一點。如:?
$ gcc -g hello.c -o hello?
$ g++ -g hello.cpp -o hello?
如果沒有-g,你將看不見程序的函數名、變量名,所代替的全是運行時的內存地址。當你用-g把調試信息加入之后,并成功編譯目標代碼以后,讓我們來看看如何用gdb來調試他。?
啟動GDB的方法有以下幾種:
1、$gdb?program
program也就是你的執行文件,如上面的hello,一般在當然目錄下。?
2、$gdb core?
用gdb同時調試一個運行程序和core文件,core是程序非法執行后core dump后產生的文件。?
(在命令行運行這些命令后,啟動gdb后,就你被帶入gdb的調試環境中,就可以使用gdb的命令開始調試程序了)
詳情舉例見:https://blog.csdn.net/dadalan/article/details/3758025
一個調試示例?
——————?
源程序:tst.c?
1 #include?
2?
3 int func(int n)?
4 {?
5 int sum=0,i;?
6 for(i=0; i<7; i++) {
8 sum+=i;?
9 }?
10 return sum;?
11 }?
12?
13?
14 main()?
15 {?
16 int i;?
17 long result = 0;?
18 for(i=1; i<=100; i++)?
19 {?
20 result += i;?
21 }?
22?
23 printf("result[1-100] = %d /n", result );?
24 printf("result[1-250] = %d /n", func(250) );?
25 }?
編譯生成執行文件:(Linux下)?
hchen/test$ gcc -g tst.c -o tst?
使用GDB調試:?
hchen/test$ gdb tst <---------- 啟動GDB?
GNU gdb 5.1.1?
Copyright 2002 Free Software Foundation, Inc.?
GDB is free software, covered by the GNU General Public License, and you are?
welcome to change it and/or distribute copies of it under certain conditions.?
Type "show copying" to see the conditions.?
There is absolutely no warranty for GDB. Type "show warranty" for details.?
This GDB was configured as "i386-suse-linux"...?
(gdb) l <-------------------- l命令相當于list,從第一行開始例出原碼。?
1 #include?
2?
3 int func(int n)?
4 {?
5 int sum=0,i;?
6 for(i=0; i 7 {?
8 sum+=i;?
9 }?
10 return sum;?
(gdb) <-------------------- 直接回車表示,重復上一次命令?
11 }
12?
13?
14 main()?
15 {?
16 int i;?
17 long result = 0;?
18 for(i=1; i<=100; i++)?
19 {?
20 result += i;?
(gdb) break 16 <-------------------- 設置斷點,在源程序第16行處。break命令也可簡寫成b?
Breakpoint 1 at 0x8048496: file tst.c, line 16.?
(gdb) break func <-------------------- 設置斷點,在函數func()入口處。?
Breakpoint 2 at 0x8048456: file tst.c, line 5.?
(gdb) info break <-------------------- 查看斷點信息。?
Num Type Disp Enb Address What?
1 breakpoint keep y 0x08048496 in main at tst.c:16?
2 breakpoint keep y 0x08048456 in func at tst.c:5?
(gdb) r <--------------------- 運行程序,run命令簡寫?
Starting program: /home/hchen/test/tst?
Breakpoint 1, main () at tst.c:17 <---------- 在斷點處停住。?
17 long result = 0;?
(gdb) n <--------------------- 單條語句執行,next命令簡寫。?
18 for(i=1; i<=100; i++)?
(gdb) n?
20 result += i;?
(gdb) n?
18 for(i=1; i<=100; i++)?
(gdb) n?
20 result += i;?
(gdb) c <--------------------- 繼續運行程序,continue命令簡寫。?
Continuing.?
result[1-100] = 5050 <----------程序輸出。?
Breakpoint 2, func (n=250) at tst.c:5?
5 int sum=0,i;?
(gdb) n?
6 for(i=1; i<=n; i++)?
(gdb) p i <--------------------- 打印變量i的值,print命令簡寫。?
$1 = 134513808?
(gdb) n?
8 sum+=i;?
(gdb) n?
6 for(i=1; i<=n; i++)
(gdb) p sum?
$2 = 1?
(gdb) n?
8 sum+=i;?
(gdb) p i?
$3 = 2?
(gdb) n?
6 for(i=1; i<=n; i++)?
(gdb) p sum?
$4 = 3?
(gdb) bt <--------------------- 查看函數堆棧。?
#0 func (n=250) at tst.c:5?
#1 0x080484e4 in main () at tst.c:24?
#2 0x400409ed in __libc_start_main () from /lib/libc.so.6?
(gdb) finish <--------------------- 退出函數。?
Run till exit from #0 func (n=250) at tst.c:5?
0x080484e4 in main () at tst.c:24?
24 printf("result[1-250] = %d /n", func(250) );?
Value returned is $6 = 31375?
(gdb) c <--------------------- 繼續運行。?
Continuing.?
result[1-250] = 31375 <----------程序輸出。?
Program exited with code 027. <--------程序退出,調試結束。?
(gdb) q <--------------------- quit,退出gdb。?
hchen/test$????回到linux命令行
以上示例展示了:進入gdb調試環境方式gcc -g,加斷點命令break,開始執行命令run,單步執行next,繼續連續執行命令continue,打印變量命令print,退出函數命令finish,退出gdb調試環境命令quit。
gcc -g main.c -o main? ? ? ? ? ? //把調試信息加到可執行文件中
gdb main? ? ? ? ? ? ? ? //進入gdb調試環境
(gdb) start? ? ? ? ? ? ? ? ? ? ? ? //開始調試
(gdb) n? ? ? ? ? ? ? ? ? ? ? ? ? ? //一條一條執行
(gdb) step/s? ? ? ? ? ? ? ? ? ? ? ? //執行下一條,如果函數進入函數
(gdb) backtrace/bt? ? ? ? ? ? ? ? ? //查看函數調用棧幀
(gdb) info/i locals? ? ? ? ? ? ? ? //查看當前棧幀局部變量
(gdb) frame/f? ? ? ? ? ? ? ? ? ? ? //選擇棧幀,再查看局部變量
(gdb) print/p? ? ? ? ? ? ? ? ? ? ? //打印變量的值
(gdb) finish? ? ? ? ? ? ? ? ? ? ? ? //運行到當前函數返回
(gdb) set var sum=0? ? ? ? ? ? ? ? //修改變量值
(gdb) list/l 行號或函數名? ? ? ? ? ? //列出源碼
(gdb) display/undisplay sum? ? ? ? //每次停下顯示變量的值/取消跟蹤
(gdb) break/b? 行號或函數名? ? ? ? ? //設置斷點
(gdb) continue/c? ? ? ? ? ? ? ? ? ? //連續運行
(gdb) info/i breakpoints? ? ? ? ? ? //查看已經設置的斷點
(gdb) delete breakpoints 2? ? ? ? ? //刪除某個斷點
(gdb) disable/enable breakpoints 3? //禁用/啟用某個斷點
(gdb) break 9 if sum != 0? ? ? ? ? //滿足條件才激活斷點
(gdb) run/r? ? ? ? ? ? ? ? ? ? ? ? //重新從程序開頭連續執行
(gdb) watch input[4]? ? ? ? ? ? ? ? //設置觀察點
(gdb) info/i watchpoints? ? ? ? ? ? //查看設置的觀察點
(gdb) x/7b input? ? ? ? ? ? ? ? ? ? //打印存儲器內容,b--每個字節一組,7--7組
(gdb) disassemble? ? ? ? ? ? ? ? ? //反匯編當前函數或指定函數
(gdb) si? ? ? ? ? ? ? ? ? ? ? ? ? ? // 一條指令一條指令調試 而 s 是一行一行代碼
(gdb) info registers? ? ? ? ? ? ? ? // 顯示所有寄存器的當前值
(gdb) x/20 $esp? ? ? ? ? ? ? ? ? ? //查看內存中開始的20個數