Linux 之 入門

目錄 start

  1. Linux系統
    1. 用戶
    2. 用戶組
    3. 環境變量
      1. 全局環境變量
      2. 局部環境變量
      3. 加載環境變量
    4. 信號量
    5. 進程
      1. 孤兒進程和僵死進程
        1. 孤兒進程
        2. 僵死進程
      2. 守護進程
      3. 線程
      4. 文件描述符 FD
    6. 時間
    7. 服務管理
      1. systemd管理服務
      2. 自啓服務
  2. 硬件信息
    1. 內存
      1. 虛擬內存
      2. 交換內存
  3. 終端快捷鍵
    1. Delete
    2. Convert
    3. Jump
    4. Search
    5. Control
  4. 常見對比
    1. 文件系統對比
    2. 桌面環境對比
    3. 窗口管理器對比
    4. 文件管理器對比
    5. 包管理
  5. Tips
    1. 一行執行多條命令
    2. 讓命令在後臺運行
    3. 修改主機名

目錄 end|2020-03-16 22:11|


Linux系統

只是記錄了debian系的Linux, 不過也是大同小異

新手的話特別注意不要隨意用sudo然後更改配置文件,容易導致系統crash(除非你明確的知道這個更改操作的作用)


用戶

  • 添加用戶 sudo adduser username
    • 注意 useradd 命令只新建用戶不會創建用戶主目錄
  • 添加到sudo組 ,使用命令更安全:sudo gpasswd -a $USER sudo 但是要註銷或者重啓才生效
    • 或者:添加用戶到用戶組:adduser user group
    • 或者:使用修改文件的方式:(不推薦) 但是在docker中跑Ubuntu新建用戶時很有用,也可以不用動文件,添加進組是有效的,看情況吧
      • chmod 777 /etc/sudoers 然後直接sudo visudo就是調用vi來打開文件的簡寫
      • 添加一行 kuang ALL=(ALL:ALL)ALL Centos:kuang ALL=(ALL) ALL
      • chmod 440 /etc/sudoers
      • rwx 對應一個三位的二進制數, 1/0 表示開關
  • 查看是否設置成功 : groups username
  • 刪除用戶以及對應的home目錄:sudo deluser username --remove-home

  • 切換用戶 su
  • su -l username 當前用戶的環境下登錄用戶(當成一個程序一樣可以退出登錄)

  • 修改密碼 passwd
    • passwd user
    • echo "root:caishi" | chpasswd 如果是普通用戶就是 sudo chpasswd

  • 修改相關信息 usermod
verb long verb comment
-d –home HOME_DIR 用戶的新主目錄
-e –expiredate EXPIRE_DATE 設定帳戶過期的日期爲 EXPIRE_DATE
-f –inactive INACTIVE 過期 INACTIVE 天數後,設定密碼爲失效狀態
-g –gid GROUP 強制使用 GROUP 爲新主組
-G –groups GROUPS 新的附加組列表 GROUPS
-a –append GROUP 將用戶追加至上邊 -G 中提到的附加組中,並不從其它組中刪除此用
-l –login LOGIN 新的登錄名稱
-L –lock 鎖定用戶帳號
-m –move-home 將家目錄內容移至新位置 (僅於 -d 一起使用)
-p –password PASSWORD 將加密過的密碼 (PASSWORD) 設爲新密碼
-R –root CHROOT_DIR chroot 到的目錄
-s –shell SHELL 該用戶帳號的新登錄 shell
-U –unlock 解鎖用戶帳號

所有參數說明


  • passwd 選項 用戶名 更改口令(密碼)
    • -l 鎖定口令,禁用賬號 -u 口令解鎖 -d 賬號無口令 -f 強迫用戶下次登錄時修改口令
    • 當前用戶 passwd 就是修改當前用戶口令 超級用戶就可以命令後接用戶名,修改任意用戶

  • pwcov 注:同步用戶從/etc/passwd 到/etc/shadow
  • pwck 注:pwck是校驗用戶配置文件/etc/passwd 和/etc/shadow 文件內容是否合法或完整;
  • pwunconv 注:是pwcov 的立逆向操作,是從/etc/shadow和 /etc/passwd 創建/etc/passwd ,然後會刪除 /etc/shadow 文件;
  • finger 注:查看用戶信息工具
  • id 注:查看用戶的UID、GID及所歸屬的用戶組
  • chfn 注:更改用戶信息工具
  • visudo 注:visodo 是編輯 /etc/sudoers 的命令;也可以不用這個命令,直接用vi 來編輯 /etc/sudoers 的效果是一樣的;

用戶組

相關 博客

  • 修改用戶至指定組 sudo usermod -G 用戶組 用戶

  • 顯示用戶所在組 groups

    • 缺省是當前用戶, 若指定即輸出指定用戶的用戶組
  • 添加用戶組 groupadd

    • 缺省參數 就是新建用戶組
    • -g GID 指定新用戶組的組標識號GID
    • -o 一般和g共用 表示新用戶組的GID可以與系統已有用戶組的GID相同。
  • 刪除用戶組 groupdel

  • groupmod 選項 用戶組

    • -g GID 爲用戶組指定新的組標識號。
    • -o 與-g選項同時使用,用戶組的新GID可以與系統已有用戶組的GID相同。
    • -n 新用戶組 將用戶組的名字改爲新名字
  • grpck 檢查/etc/group文件是否正確

  • grpconv 注:通過/etc/group和/etc/gshadow 的文件內容來同步或創建/etc/gshadow ,如果/etc/gshadow 不存在則創建;

  • 注:通過/etc/group 和/etc/gshadow 文件內容來同步或創建/etc/group ,然後刪除gshadow文件


環境變量

全局環境變量

局部環境變量

加載環境變量

  1. /etc/profile
  2. $HOME/.bash_profile
  3. $HOME/.bashrc
  4. $HOME/.bash_login
  5. $HOME/.profile

千萬別混淆 Bash/Zsh 的四種運行模式
ssh連接遠程主機執行腳本的環境變量問題


信號量

進程通信的一種標準化的方式

/bin/kill -L 可查看所有信號量

 1 HUP      2 INT      3 QUIT     4 ILL      5 TRAP     6 ABRT     7 BUS
 8 FPE      9 KILL    10 USR1    11 SEGV    12 USR2    13 PIPE    14 ALRM
15 TERM    16 STKFLT  17 CHLD    18 CONT    19 STOP    20 TSTP    21 TTIN
22 TTOU    23 URG     24 XCPU    25 XFSZ    26 VTALRM  27 PROF    28 WINCH
29 POLL    30 PWR     31 SYS

編號爲1 ~ 31的信號爲傳統UNIX支持的信號,是不可靠信號(非實時的),編號爲32 ~ 63的信號是後來擴充的,稱做可靠信號(實時信號)。
不可靠信號和可靠信號的區別在於前者不支持排隊,只是負責發送, 不負責存儲和接收, 可能會造成信號丟失,而後者不會。

參考

常用信號

  • 2 INT
    • interrupt 中斷信號
  • 9 KILL
    • kill 進程不可忽略
  • 15 TERM
    • terminate 終止信號

進程

參考 深入理解計算機系統 書籍

  1. 查看 Linux平臺 進程最大數限制 ulimit -u
  2. 設置最大值 ulimit -u 5120
  3. pid_t來表示一個進程的pid,因此能表示的進程的範圍一定不會超過pid_t類型的大小
    • 查看 pid 範圍 cat /proc/sys/kernel/pid_max

doc: fork
fork bomb

孤兒進程和僵死進程

參考博客: 孤兒進程與僵死進程[總結]

孤兒進程

一個父進程退出,而它的子進程還在運行,那麼那些子進程將成爲孤兒進程。孤兒進程將被init進程(進程號爲1)所收養,並由init進程對它們完成狀態收集工作。

注意, 也有意外, 並不總是被 init 進程收養 Ubuntu15.04 刪除/sbin/upstart與孤兒進程收養的問題

僵死進程

一個進程使用fork創建子進程,如果子進程退出,而父進程並沒有調用wait或waitpid獲取子進程的狀態信息,那麼子進程的進程描述符仍然保存在系統中, 這種進程稱之爲僵死進程。
因爲直到父進程結束後, 該僵死子進程會成爲孤兒進程且是僵死進程, 會被 init 收養, 從而被回收, 但是如果父進程一直沒有結束, 僵死子進程會一直存在

  • 危害:
    • 佔用系統內存 pid等資源, 無法被回收

常規解決方案 Github: 代碼示例

  1. 處理信號: 子進程退出時向父進程發送SIGCHILD信號,父進程處理SIGCHILD信號。在信號處理函數中調用wait進行處理僵死進程。
  2. fork兩次: 原理是將子進程成爲孤兒進程,從而其的父進程變爲init進程,通過init進程可以處理僵死進程。

暴力方案: 直接 kill 掉父進程, 父進程和僵死狀態的子進程就一起被回收了

守護進程

參考博客: 守護進程

線程

  1. 查看創建一個線程佔用內存大小 ulimit -s

文件描述符 FD

參考博客: Linux下 文件描述符(fd)與 文件指針(FILE*)

每一個進程在PCB(Process Control Block)即進程控制塊中都保存着一分文件描述符表,文件描述符就是這個表的索引文件,描述符表中每個表項都有一個指向已打開文件的指針。
現在我們明確一下:已打開的文件在內核中用file結構體表示,文件描述符表中的指針指向file結構體。

  • 每個進程默認FD有 0 標準輸入 1 標準輸出 2 錯誤輸出

時間

同步Linux服務器時間

  • /etc/timezone 時區, /etc/localtime 時區及時間

同步時間

  1. 修改時區 cp -y /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  2. 同步時間 /usr/sbin/ntpdate -u cn.pool.ntp.org | 沒有就先安裝 ntpdate
  3. 查看硬件時間 hwclock -r
    • 如果不同步就需要寫入時間 hwclock -w 因爲系統重啓是參考硬件時間的

自動同步時間

  1. 配置開機自動校驗 vim /etc/rc.d/rc.local
    • /usr/sbin/ntpdate -u cn.pool.ntp.org> /dev/null 2>&1; /sbin/hwclock -w
  2. 配置定時任務 crontab -e
    • 00 10 * * * root /usr/sbin/ntpdate -u cn.pool.ntp.org > /dev/null 2>&1; /sbin/hwclock -w

服務管理

systemd管理服務

Arch Doc: systemd

  • systemctl start/stop/restart/reload/edit serviceName 例如 sshd docker 等服務
command 作用
start/stop 啓動/停止服務
enable/disable 開機啓用/禁用
restart 如果服務在運行中,則重啓服務,若不在運行中,則將會啓動
try-restart 只在服務已存在運行的狀態下啓動服務
reload 重新加載配置文件
edit 修改服務配置
status 查看運行狀態

系統電源管理

systemctl 命令 作用
systemctl poweroff 關閉系統
systemctl reboot 重啓系統
systemctl suspend 進入待機模式
systemctl hibernate 進入休眠模式
systemctl hybrid-sleep 進入混合休眠模式

自啓服務

/etc/init.d/ 是服務的存放目錄

  1. 列出所有服務的狀態 service --status-all
  2. 移除MySQL的自啓 sudo update-rc.d -f mysql remove
  3. 設置MySQL隨機啓動 sudo update-rc.d mysql defaults
  4. 設定MySQL啓動順序 update-rc.d mysql defaults 90 數字越小, 啓動順序越前
  • sysv-rc-conf 略微圖形化的管理服務的開機自啓
  • chkconfig 簡單的輸出服務自啓狀態

系統運行級別

    0        系統停機狀態
    1        單用戶或系統維護狀態
    2~5      多用戶狀態
    6        重新啓動 

硬件信息

  • 查看系統PCI設備:lspci
  • 查看CPU信息:more /proc/cpuinfo
    • 查看物理CPU數:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l
    • 查看每個物理CPU中的內核的個數:cat /proc/cpuinfo | grep "cpu cores"
    • 查看系統所有邏輯CPU個數:cat /proc/cpuinfo | grep "processor" | wc -l
  • 查看系統內存信息:more /proc/meminfo
  • 查看磁盤分區信息:df -l

內存

虛擬內存

參考博客: What does Virtual memory size in top mean?

參考博客: The Right Way to Monitor Virtual Memory on Linux

交換內存

swapon, swapoff - enable/disable devices and files for paging and swapping


終端快捷鍵

  • 鼠標中鍵 粘貼鼠標左鍵已選擇的文本 VSCode中也適用
  • !num history 中第 num 條命令
  • !! 上一條命令
  • ls !$ 執行命令ls,並以上一條命令的參數爲其參數
  • !?string? 執行含有string字符串的最新命令
  • Ctrl L 清屏等價於clear,清除所有這個 shell 提示屏幕中顯示的數據。 Mysql也適用
  • reset 刷新 shell 提示屏幕。如果字符不清晰或亂碼的話,在 shell 提示下鍵入這個命令會刷新屏幕。
  • Ctrl ; 顯示最近五條剪貼板內容
  • Ctrl Alt Backspace : 殺死你當前的 X 會話。殺死圖形化桌面會話,把你返回到登錄屏幕。如果正常退出步驟不起作用,你可以使用這種方法。
  • Ctrl Alt Delete : 關機和重新引導 Red Hat Linux。關閉你當前的會話然後重新引導 OS。只有在正常關機步驟不起作用時才使用這種方法。
  • Ctrl Alt Fn: 切換屏幕。 根據默認設置,從 [F1] 到 [F6] 是 shell 提示屏幕, [F7] 是圖形化屏幕。但是deepin是F1爲圖形化

Delete

Controller Key comment
Ctrl D 刪除光標後字符,等價於Delete鍵(命令行若無任何字符,則相當於exit;處理 多行標準輸入時也表示EOF)
Ctrl H 退格刪除一個字符,相當於通常的Backspace鍵
Ctrl U 刪除光標之前到 行首 的字符 (Zsh中是刪除整行)
Esc W 刪除光標之前到 行首 的字符
Ctrl K 刪除光標之前到 行尾 的字符
Ctrl W 刪除光標之前的一個單詞
Alt D 刪除光標之後的一個單詞
Ctrl Y 粘貼上次刪除的所有字符
Ctrl _ 撤銷修改 等價於 Ctrl x u

Convert

Controller Key comment
Ctrl T 互換當前字符,光標後移
Alt T 互換當前單詞與前一個單詞,光標後移 等價於 Esc T
Alt D 將當前單詞全部轉爲大寫,光標後移
Alt C 將當前單詞首字母轉爲大寫,光標後移
Alt L 將當前單詞全部轉爲小寫,光標後移(zsh無效)

Jump

Controller Key comment
Ctrl C 取消運行當前行輸入的命令,相當於Ctrl + Break
Ctrl A 光標移動到行首(Ahead of line),相當於通常的Home鍵
Ctrl E 光標移動到行尾(End of line)
Ctrl F 光標向前(Forward)移動一個字符位置
Ctrl B 光標往回(Backward)移動一個字符位置
Alt F 光標向前(Forward)移動一個單詞位置
Alt B 光標往回(Backward)移動一個單詞位置
Esc F 光標向前(Forward)移動到當前單詞的頭部
Esc B 光標往回(Backward)移動到當前單詞的尾部

Search

Controller Key comment
Ctrl P 調出命令歷史中的前一條(Previous)命令,相當於通常的上箭頭
Ctrl N 調出命令歷史中的下一條(Next)命令,相當於通常的下箭頭
Ctrl O 運行上翻下翻出來的命令, 並且自動將下一條命令填入
Ctrl R 向上搜索相關命令(reverse-i-search)繼續按 Ctrl R 則繼續搜索上一條
Ctrl S 與 Ctrl R 類似, 但是是向下搜索

Control

Controller Key comment
Ctrl Z 暫停程序
Ctrl S 停止回顯當前Shell
Ctrl Q 恢復回顯當前Shell

常見對比

文件系統對比

參考博客: 如何選擇文件系統:EXT4、Btrfs 和 XFS

目前 Linux 大多采用 ext3,往 ext4 過渡

桌面環境對比

Arch Doc: desktop environment
參考: Linux下15款桌面環境

  1. gnome 佔用資源中等,個人對該桌面不感冒
  2. xfce 佔用資源少,操作類似於xp
  3. kde 功能強大,佔用資源中等
  4. dde deepin設計的桌面環境,小bug略多,但是美觀操作方便

X窗口系統的協議和架構
Arch Doc: Xorg

窗口管理器對比

Arch Doc: window manager


文件管理器對比

有單窗口,雙列,命令,簡潔輕量,笨重完整 各種各樣的選擇

  • nautilus Gnome默認 挺好用,但是不能自動掛載分區
  • deepin-filemanager deepin默認,較爲方便,但是打開手機會卡根本打不開
  • pcmanfm 左邊側欄目錄樹 會同步nautilus的配置5m
  • rox-filer 特別小,單擊打開,迅速定位文件,適合找東西用
  • thunar 解決了nautilus的缺點,內存也很省 21M
  • dolphin 多標籤頁,目錄樹方式查看
  • nemo mint默認的,功能齊全,會同步nautilus的配置,同樣有目錄樹而且是兩邊都有 21M
  • tuxcmd Tux Commander 雙列,小,直接的目錄樹,學習成本高點 2M

包管理

A universal app store for Linux


Tips

man help 後接使用的命令,就可以得到用戶手冊和幫助文檔

一行執行多條命令

  • && 第2條命令只有在第1條命令成功執行之後才執行 根據命令產生的退出碼判斷是否執行成功(0成功,非0失敗)

  • || 執行不成功(產生了一個非0的退出碼)時,才執行後面的命令

  • ; 順序執行多條命令,當;號前的命令執行完(不管是否執行成功),才執行;後的命令。

  • & 並行執行命令,沒有順序

  • tty 虛擬終端等概念

  • Centos上which並不是命令, 而是別名!

    • which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

讓命令在後臺運行

參考 Linux 技巧:讓進程在後臺可靠運行的幾種方法

  • 命令後接 & (只是讓進程成爲job並在當前終端的後臺執行 hup信號仍然能影響到)

運行的命令不因 用戶註銷,網絡中斷等因素而中斷 nohup, disown, screen, setid

  • 讓進程對 hang up 信號免疫:
    • nohup, disown
  • 讓進程的父進程改爲1號進程:
    • setid, (command &)
  • screen

示例

  1. 使用nohup就能屏蔽hup信號,標準輸出會輸出到當前目錄下的nohup.out文件. nohup 命令 &
    1. 將標準輸出重定向到空設備 並將錯誤輸出重定向到標準輸出 nohup 命令>/dev/null 2>&1
  2. 例如 在當前目錄後臺打開文件管理器 (dde-file-manager . &) >/dev/null 2>&1

修改主機名

  • sudo hostname linux 重啓終端即可看到修改
  • 但是重啓電腦會恢復原有名字修改如下文件永久: sudo gedit /etc/hostname 也許需要更改/etc/hosts
  • 立即生效,也要重新登錄 hostname -F /etc/hostname
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章