網路配置及程序-系統效能和計劃任務

三两螺蛳粉發表於2024-11-18

目錄

  • 虛擬機器聯網
  • shell指令碼例項
  • 索引陣列和關聯陣列,字串處理,高階變數
  • 程序管理
  • 計劃任務

虛擬機器聯網

檢視IP地址

#centos系列!

[root@localhost ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.93.200  netmask 255.255.255.0  broadcast 192.168.93.255
        inet6 fe80::20c:29ff:fe0c:5043  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:0c:50:43  txqueuelen 1000  (Ethernet)
        RX packets 78  bytes 8852 (8.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 81  bytes 9229 (9.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0


ifconfig命令檢視ip或者用ip r命令檢視路由和閘道器,如果這兩個命令都無法顯示ip地址,操作步驟如下:
首先輸入ip addr,檢視ens33(不一定是ens33)網路卡配置,輸入 vi /etc/sysconfig/network-scripts/ifcfg-ens33
將ONBOOT許可權改為yes

設定靜態IP(NAT模式)

#centos系列
注意:配置靜態ip時不能起衝突,可以先在本機ping一下你想要配置的ip,ping得通就不要用,ping超時可以使用。

[root@linux-server ~]# cd /etc/sysconfig/network-scripts/  #網路卡配置檔案存放路徑
[root@linux-server network-scripts]# cp ifcfg-ens33 ifcfg-ens33.bak #將原始檔備份
[root@linux-server network-scripts]# vi ifcfg-ens33 #編輯網路卡配置檔案
TYPE="Ethernet"         #網路型別:乙太網型別
PROXY_METHOD="none"   
BROWSER_ONLY="no"
BOOTPROTO="static"    #預設值none或static 這兩種屬於靜態獲取ip地址,dhcp自動獲取ip
IPADDR=192.168.93.200 #設定靜態ip地址
GATEWAY=192.168.93.2 #設定閘道器,nat模式閘道器是2,橋接為1
NETMASK=255.255.255.0  #設定子網掩碼
#PREFIX=24
DEFROUTE="yes"  #是否設定預設路由,yes表示該配置
NAME="ens33"    #網路卡名稱,可以不存在
DEVICE="ens33"   #裝置名稱
ONBOOT="yes"    #開機啟動
DNS1=114.114.114.114 #dns全國通用地址,dns最多可以設定三個
DNS2=8.8.8.8 #谷歌的dns
DNS3=202.106.0.20 #北京的DNS。

#重啟網路
[root@linux-server ~]# systemctl restart NetworkManager  #centos8以後
[root@linux-server ~]# systemctl restart network         #centos7

ubuntu配置靜態IP

#查詢網路介面
root@ubuntu:~# ip link  

#編輯 netplan 配置檔案
root@ubuntu:~# vi /etc/netplan/01-netcfg.yaml
network:
  version: 2
  ethernets:
    enp0s3:
      dhcp4: no
      addresses:
        - 192.168.93.201/24
      gateway4: 192.168.93.2
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
#配置生效
root@ubuntu:~# netplan apply

shell指令碼例項

使用指令碼判斷主機所在網路內線上的主機IP有哪些

#!/bin/bash

subnet="192.168.1"  #定義子網字首
start=1
end=254   #ip地址範圍

#使用ping 測試一個 IP 地址
#函式
ping_test() {
    local ip=$1
    if ping -c 1 -W 2 $ip &> /dev/null; #傳送一個 ICMP 請求,超時時間為 2 秒 
 then
        echo "$ip is online"
    fi
}

#遍歷子網中的所有 IP 地址
for ((i=start; i<=end; i++))
do
    ip="$subnet.$i"
    ping_test $ip &  #呼叫 ping_test 函式,並將其放在後臺執行(使用 &)
done

# 等待所有後臺程序完成
wait

[root@linux-server ~]# chmod +x network.sh
[root@linux-server ~]# .network.sh
or
[root@linux-server ~]# bash network.sh

使用while read line和/etc/passwd,計算使用者id總和

#!/bin/bash

# 初始化使用者ID總和變數
total_uid=0

# 讀取 /etc/passwd 檔案的每一行
while IFS=: read -r username password uid gid info home shell; do
    # 將當前行的UID加到總和中
    total_uid=$((total_uid + uid))
done < /etc/passwd  #指定輸入檔案為 /etc/passwd

# 輸出使用者ID總和
echo "Total UID sum: $total_uid"

解讀:

使用 IFS=: 指定欄位分隔符為冒號,讀取/etc/passwd 檔案的每一行,並將欄位分別賦值給 username、password、uid、gid、info、home 和 shell 變數。

使用遞迴呼叫,完成階乘演算法實現

#!/bin/bash

# 定義遞迴階乘函式
factorial() {
    local n=$1
    if [[ $n -eq 0 ]]; then
        echo 1
    else
        echo $(( n * $(factorial $((n - 1))) ))
    fi
}

# 測試階乘函式
for i in {0..10}; do
    result=$(factorial $i)
    echo "$i! = $result"
done

解讀:

定義遞迴函式:
* factorial() 是一個遞迴函式,接受一個引數 n。
* 如果 n 等於 0,返回 1(因為 0!=1),
否則,返回 n 乘以 factorial(n - 1) 的結果。

測試階乘函式:
* 使用 for 迴圈從 0 到 10 測試階乘函式。
* 呼叫 factorial 函式並將結果儲存在 result 變數中。
* 輸出結果。

求10個隨機數的最大值與最小值

#!/bin/bash

# 建立索引陣列
random_numbers=(1 3 100 9 10 18 0 77 96 2)

# 初始化最大值和最小值
max_value=${random_numbers[0]}
min_value=${random_numbers[0]}

# 遍歷陣列,找到最大值和最小值
for num in "${random_numbers[@]}"; do
    if [[ $num -gt $max_value ]]; then
        max_value=$num
    fi
    if [[ $num -lt $min_value ]]; then
        min_value=$num
    fi
done

# 輸出最大值和最小值
echo "Maximum value: $max_value"
echo "Minimum value: $min_value"

索引陣列和關聯陣列,字串處理,高階變數

索引陣列
特點

  • 索引陣列的鍵是整數,通常從0開始。
  • 鍵值是自動生成的,除非顯式指定。

範例:
# 建立索引陣列
array=(apple banana pear)

# 訪問元素
echo "${array[0]}"    # 輸出: apple
echo "${array[1]}"    # 輸出: banana
echo "${array[2]}"    # 輸出: pear

# 獲取陣列長度
echo "${#array[@]}"   # 輸出: 3

# 遍歷陣列
for fruit in "${array[@]}"; do
    echo "$fruit"
done

# 新增元素
array+=("date")
echo "${array[@]}"    # 輸出: apple banana pear date

# 刪除元素
unset array[1]
echo "${array[@]}"    # 輸出: apple pear date

關聯陣列
特點

  • 關聯陣列的鍵可以是任意字串。
  • 需要在宣告時使用 declare -A。
範例:
# 宣告關聯陣列
declare -A fruits

# 新增元素
fruits[apple]="red"
fruits[banana]="yellow"
fruits[pear]="green"

# 訪問元素
echo "${fruits[apple]}"   # 輸出: red
echo "${fruits[banana]}"  # 輸出: yellow
echo "${fruits[pear]}"  # 輸出: green

# 獲取所有鍵
echo "${!fruits[@]}"      # 輸出: apple banana pear

# 獲取所有值
echo "${fruits[@]}"       # 輸出: red yellow green

# 遍歷陣列
for key in "${!fruits[@]}"; do
    echo "$key: ${fruits[$key]}"
done

# 刪除元素
unset fruits[banana]
echo "${!fruits[@]}"      # 輸出: apple pear

字串處理
常用命令和操作

  • length=${#string}:獲取字串長度。
  • substring=${string:start:length}:獲取子字串。
  • replace=${string//pattern/replacement}:替換字串中的模式。
  • lowercase=${string,,}:轉換為小寫。
  • uppercase=${string^^}:轉換為大寫。

範例:
# 定義字串
string="Hello, World!"

# 獲取字串長度
length=${#string}
echo "Length: $length"    # 輸出: Length: 13

# 獲取子字串
substring=${string:0:5}
echo "Substring: $substring"    # 輸出: Substring: Hello

# 替換字串中的模式
replace=${string//World/Universe}
echo "Replace: $replace"    # 輸出: Replace: Hello, Universe!

# 轉換為小寫
lowercase=${string,,}
echo "Lowercase: $lowercase"    # 輸出: Lowercase: hello, world!

# 轉換為大寫
uppercase=${string^^}
echo "Uppercase: $uppercase"    # 輸出: Uppercase: HELLO, WORLD!

高階變數使用
引數擴充套件

  • ${variable:-default}:如果變數未設定或為空,則使用預設值。
  • ${variable:=default}:如果變數未設定或為空,則設定變數為預設值。
  • ${variable:?message}:如果變數未設定或為空,則輸出錯誤訊息並退出。
  • ${variable:+other}:如果變數已設定且非空,則使用其他值。

範例:
# 引數擴充套件
variable=""
echo "${variable:-default}"    # 輸出: default
echo "${variable:=default}"    # 變數現在被設定為 "default"
echo "${variable:?error message}"    # 輸出: default
echo "${variable:+other}"    # 輸出: other

# 未設定變數的情況
unset variable
echo "${variable:-default}"    # 輸出: default
echo "${variable:=default}"    # 變數現在被設定為 "default"
echo "${variable:?error message}"    # 輸出: default
echo "${variable:+other}"    # 不輸出,因為變數已設定

綜合示例

#!/bin/bash

# 定義索引陣列
fruits=("apple" "banana" "pear")

# 定義關聯陣列
declare -A colors
colors[apple]="red"
colors[banana]="yellow"
colors[cherry]="green"

# 遍歷索引陣列並列印顏色
for fruit in "${fruits[@]}"; do
    color=${colors[$fruit]}
    echo "The color of $fruit is ${color:-unknown}"
done

# 字串處理
sentence="The quick brown fox jumps over the lazy dog."
length=${#sentence}
echo "Sentence length: $length"

# 替換字串中的單詞
new_sentence=${sentence//fox/tiger}
echo "New sentence: $new_sentence"

# 引數擴充套件
default_value="default"
value=""
echo "Value: ${value:-$default_value}"    # 輸出: Value: default

# 設定變數
unset value
echo "Value: ${value:=set_now}"
echo "Value: $value"    # 輸出: Value: set_now

# 檢查變數
unset value
echo "Value: ${value:?Variable not set}"    # 輸出錯誤訊息並退出

程序管理

程序的生命週期狀態

建立狀態:

  • 程序正在被建立,但尚未準備好執行
  • 程序的資源尚未完全分配,例如記憶體、檔案描述符等
  • 一旦資源分配完成,程序將從新建狀態進入就緒狀態

就緒狀態:

  • 程序已經準備好執行,但尚未獲得 CPU 時間片。
  • 程序在就緒佇列中等待排程器分配 CPU 時間。
  • 當排程器選擇該程序時,程序將從就緒狀態進入執行狀態。

執行狀態:

  • 程序正在 CPU 上執行。
  • 程序佔用 CPU 資源,執行其指令。
  • 如果程序的時間片用完,將從執行狀態進入就緒狀態。
  • 如果程序等待某個事件(如 I/O 操作完成),將從執行狀態進入阻塞狀態。
  • 如果程序執行完畢或被終止,將從執行狀態進入終止狀態。

阻塞狀態:

  • 程序暫時停止執行,等待某個事件的發生,例如 I/O 操作完成、鎖的釋放等。
  • 程序不在 CPU 上執行,而是等待某個外部條件滿足。
  • 當等待的事件發生時,程序將從阻塞狀態進入就緒狀態。

終止狀態:

  • 程序已經完成執行或被異常終止。
  • 程序的資源被釋放,不再佔用系統資源。
  • 程序進入終止狀態後,通常會被作業系統清理,從程序表中移除。

特殊狀態:
殭屍(Zombie)

  • 程序已經終止,但其父程序尚未呼叫 wait 系統呼叫來回收其狀態資訊。
  • 程序表項仍然存在,但不佔用系統資源。
  • 當父程序呼叫 wait 後,殭屍程序將被徹底清除。

僵死(Defunct)

  • 類似於殭屍狀態,但通常用於描述更長時間未能被回收的程序。
  • 程序表項仍然存在,但不佔用系統資源。
  • 當父程序呼叫 wait 後,僵死程序將被徹底清除。

程序與執行緒的區別

程序(Process)

  • 定義:程序是作業系統分配資源的最小單位。每個程序都有獨立的記憶體空間。
  • 資源:每個程序擁有獨立的虛擬地址空間、檔案描述符、環境變數等資源。
  • 隔離性:程序之間是完全隔離的,一個程序的崩潰不會影響其他程序。

執行緒(Thread)

  • 定義:執行緒是程式執行的CPU排程的最小單位。一個程序中可以有多個執行緒,這些執行緒共享同一記憶體空間和其他資源。
  • 資源:執行緒共享所屬程序的虛擬地址空間,但每個執行緒有自己的棧和程式計數器(PC)。
  • 隔離性:執行緒之間的隔離性較差,一個執行緒的錯誤可能會影響整個程序中的其他執行緒。
#檢視程序中的執行緒
grep -i threads /proc/PID/status

程序的結構

程式碼段(Text Segment)

  • 存放程式的機器指令。
  • 通常是隻讀的,防止程式意外修改自身程式碼。

資料段(Data Segment)

  • 存放全域性變數和靜態變數。
  • 分為初始化資料區和未初始化資料區(BSS段)。

堆(Heap)

  • 動態分配的記憶體區域,用於存放動態分配的資料(如透過 malloc 和 new 分配的記憶體)。
  • 堆記憶體的大小是可以變化的,通常是從低地址向高地址增長。

棧(Stack)

  • 用於存放函式呼叫時的區域性變數和函式引數。
  • 棧記憶體是自動管理的,函式呼叫時自動分配,函式返回時自動釋放。
  • 棧通常是從高地址向低地址增長。

檔案描述符表(File Descriptor Table)

  • 存放程序開啟的所有檔案描述符。
  • 每個檔案描述符對應一個檔案或裝置。

環境變數(Environment Variables)

  • 存放程序的環境變數,如 PATH、HOME 等。
  • 環境變數在程序啟動時從父程序繼承。

程序控制塊(Process Control Block, PCB)

  • 作業系統用於管理程序的資料結構。
  • 包括程序的識別符號(PID)、狀態(執行、就緒、阻塞等)、優先順序、資源使用情況等。

程序狀態

#ps aux 或者 htop 或者 top
[root@localhost ~]# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.2 172252 10304 ?        Ss   01:17   0:02 /usr/lib/systemd/systemd -
root           2  0.0  0.0      0     0 ?        S    01:17   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   01:17   0:00 [rcu_gp]

#STAT代表了程序的狀態
Ss:程序處於休眠狀態,並且是一個會話領導程序
R (Running):程序正在執行或在執行佇列中
S (Sleeping):程序處於休眠狀態,等待某個事件發生(如 I/O 操作完成)
D (Disk Sleep):程序處於不可中斷的睡眠狀態,通常是因為正在進行 I/O 操作。
T (Stopped):程序被停止。
Z (Zombie):程序已經完成執行,但其父程序尚未呼叫 wait 系統呼叫回收其狀態資訊。
t (Tracing Stop):程序因跟蹤而停止,通常是在除錯過程中。
W (Paging):程序正在交換(換頁),即部分記憶體頁面被換出到磁碟。
L (Has Pages Locked into Memory):程序有頁面被鎖定在記憶體中,不允許換出。
X (Dead):程序已經死亡,但在程序表中仍保留條目。
< (High Priority):程序具有高優先順序。
N (Low Priority):程序具有低優先順序。

IPC通訊實現方式


#程序間通訊(IPC):主要用於同一臺計算機上不同程序之間的通訊

匿名管道:僅限於父子程序之間通訊,單向。使用 pipe() 系統呼叫建立匿名管道。
命名管道(FIFO):可以在不相關的程序之間使用,雙向。使用 mkfifo() 系統呼叫建立命名管道。

訊號:用於程序間傳送簡短的通知訊息。使用 kill() 傳送訊號。使用 signal() 或 sigaction() 註冊訊號處理函式。

共享記憶體:允許多個程序訪問同一塊記憶體區域。
* 使用 shmget() 建立或獲取共享記憶體段。
* 使用 shmat() 將共享記憶體段附加到程序的地址空間。
* 使用 shmdt() 從程序的地址空間分離共享記憶體段。
* 使用 shmctl() 控制共享記憶體段。

訊息佇列:允許程序間傳送和接收訊息。
* 使用 msgget() 建立或獲取訊息佇列。
* 使用 msgsnd() 傳送訊息。
* 使用 msgrcv() 接收訊息。
* 使用 msgctl() 控制訊息佇列。

訊號量:用於同步程序間的訪問,防止競爭條件。
* 使用 semget() 建立或獲取訊號量集。
* 使用 semop() 進行訊號量操作。
* 使用 semctl() 控制訊號量集。

RPC通訊實現方式


#遠端過程呼叫(RPC):主要用於跨網路的不同計算機之間的通訊

Sun RPC:
* 使用 rpcgen 工具生成客戶端和伺服器端的程式碼。
* 定義 .x 檔案,描述遠端過程的介面。

gRPC:
* 定義 .proto 檔案,描述服務介面和訊息格式。
* 使用 protoc 編譯器生成客戶端和伺服器端的程式碼。

Apache Thrift:
* 定義 .thrift 檔案,描述服務介面和資料結構。
* 使用 thrift 編譯器生成客戶端和伺服器端的程式碼。

XML-RPC:基於 XML 和 HTTP 的簡單 RPC 協議。
* 使用 HTTP 請求傳送 XML 格式的請求和響應。
* 支援多種程式語言,如 Python、Perl 等。

前臺作業與後臺作業

定義:
前臺作業是指當前正在終端上執行的任務,它會獨佔終端,使用者必須等待該作業完成或手動停止後才能繼續輸入其他命令。

特點:
* 使用者可以看到作業的輸出。
* 使用者不能在前臺作業執行時輸入其他命令。
* 前臺作業可以接收來自鍵盤的輸入。
定義:
後臺作業是指在後臺執行的任務,不會獨佔終端,使用者可以在作業執行的同時繼續輸入其他命令。

特點:
* 使用者看不到作業的輸出,除非重定向輸出。
* 使用者可以在後臺作業執行時繼續輸入其他命令。
* 後臺作業不能接收來自鍵盤的輸入。
狀態轉換:
* 使用 Ctrl+Z 和 bg 將前臺作業轉到後臺。
* 使用 fg 將後臺作業轉到前臺。
* 使用 jobs 檢視當前作業。
* 使用 kill + 作業編號/程序PID 結束作業。

程序管理相關操作


#搜尋程序
ps aux:顯示所有使用者的程序詳細資訊。
ps -ef:顯示所有程序的詳細資訊。
ps -p <PID>:顯示指定 PID 的程序資訊。

pgrep 選項 pattern

選項:
-u uid: effective user,生效者
-U uid: real user,真正發起執行命令者
-t terminal: 與指定終端相關的程序
-l: 顯示程序名
-a: 顯示完整格式的程序名
-P pid: 顯示指定程序的子程序


#負載查詢
uptime 和 w 顯示以下內容:
當前時間
系統已啟動的時間
當前上線人數
系統平均負載(1、5、15分鐘的平均負載)
[root@localhost ~]# uptime
 04:16:12 up  2:58,  1 user,  load average: 0.06, 0.04, 0.00

[root@localhost ~]# w
 04:16:30 up  2:58,  1 user,  load average: 0.04, 0.03, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    192.168.93.1     01:17    0.00s  0.04s  0.00s w


#虛擬記憶體資訊
[root@localhost ~]# vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 3150508   6304 370536    0    0     7     2   26   42  0  0 100  0  0



#統計CPU和裝置IO資訊
此工具由sysstat包提供
[root@localhost ~]# iostat
Linux 4.18.0-348.el8.0.2.x86_64 (localhost.localdomain) 	2024年11月18日 	_x86_64_    (4 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.01    0.17    0.00    0.00   99.81

Device             tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdb               0.03         0.87         0.00       9855          4
sda               0.75        25.83         8.79     293953     100019
scd0              0.00         0.09         0.00       1041          0
dm-0              0.66        21.03         8.61     239283      97935
dm-1              0.01         0.20         0.00       2220          0
dm-2              0.00         0.09         0.00       1044          0


#顯示網路頻寬使用情況
#透過EPEL源的 iftop 包
[root@localhost ~]# iftop -ni ens33


#檢視網路實時吞吐量
#透過EPEL源提供
[root@localhost ~]# nload
#nload 是一個實時監控網路流量和頻寬使用情況,以數值和動態圖展示進出的流量情況,


#檢視程序實時狀態 top 和 htop
#htop由EPEL源提供
[root@localhost ~]# top
top - 04:20:56 up  3:03,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 168 total,   1 running, 167 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.1 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.1 hi,  0.1 si,  0.0 st
MiB Mem :   3709.8 total,   3076.1 free,    265.7 used,    368.0 buff/cache
MiB Swap:   3072.0 total,   3072.0 free,      0.0 used.   3214.1 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND              
    556 root      20   0       0      0      0 I   0.3   0.0   0:07.87 kworker/0:3-events   
      1 root      20   0  172252  10304   7924 S   0.0   0.3   0:02.39 systemd              
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.02 kthreadd             
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp               
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp      

losf命令

格式:losf [options] <...>
選項:
-a:列出開啟檔案存在的程序
-c<程序名>:列出指定程序所開啟的檔案
-g:列出GID號程序詳情
-d<檔案號>:列出佔用該檔案號的程序
+d<目錄>:列出目錄下被開啟的檔案
+D<目錄>:遞迴列出目錄下被開啟的檔案
-n<目錄>:列出使用NFS的檔案
-i<條件>:列出符合條件的程序(4、6、協議、:埠、 @ip )
-p<程序號>:列出指定程序號所開啟的檔案
-u:列出UID號程序詳情
-h:顯示幫助資訊
-v:顯示版本資訊。
-n: 不反向解析網路名字

範例:

#列出當前所有開啟的檔案
[root@localhost yum.repos.d]# lsof|head
COMMAND    PID  TID TASKCMD      USER   FD      TYPE             DEVICE  SIZE/OFF       NODE NAME
systemd      1                   root  cwd       DIR              253,0       269        128 /
systemd      1                   root  rtd       DIR              253,0       269        128 /
systemd      1                   root  txt       REG              253,0   1597128     443680 /usr/lib/systemd/systemd
systemd      1                   root  mem       REG              253,0   2191840   50332852 /usr/lib64/libm-2.28.so
systemd    


#檢視當前哪個程序正在使用此檔案
[root@localhost yum.repos.d]# lsof /usr/lib/systemd/systemd
COMMAND   PID USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
systemd     1 root txt    REG  253,0  1597128 443680 /usr/lib/systemd/systemd
systemd  1766 root txt    REG  253,0  1597128 443680 /usr/lib/systemd/systemd
(sd-pam) 1768 root txt    REG  253,0  1597128 443680 /usr/lib/systemd/systemd


#指定程序號,可以檢視該程序開啟的檔案
[root@localhost yum.repos.d]# lsof -p 22
COMMAND   PID USER   FD      TYPE DEVICE SIZE/OFF NODE NAME
watchdog/  22 root  cwd       DIR  253,0      269  128 /
watchdog/  22 root  rtd       DIR  253,0      269  128 /
watchdog/  22 root  txt   unknown                      /proc/22/exe


#檢視指定程式開啟的檔案
[root@localhost yum.repos.d]# lsof -c httpd


#檢視指定使用者開啟的檔案
[root@localhost yum.repos.d]# lsof -u root | more 

計劃任務

一次排程執行(at):
主要的用途是定期備份資料

語法格式
at <時間規格>
  now +5min
  teatime tomorrow (teatime is 16:00)
  5pm august 3 2019 

範例1:
[root@linux-server ~ ]# yum -y install at
[root@linux-server ~]# systemctl status atd    #檢視啟動狀態
[root@linux-server ~ ]# systemctl start atd		#首先要啟動服務

[root@linux-server ~]# at now +1min    #一分鐘後開始執行
at> useradd uuuu  
at> <EOT>     	#Ctrl+D 退出
job 1 at Sat Mar 21 22:34:00 2015

[root@linux-server ~]# id uuuu

範例2:
[root@linux-server ~]# vim at.jobs 
useradd u99 
useradd u00 
touch /a.txt

[root@linux-server ~]# at 20:33 < at.jobs

迴圈排程執行cron 使用者級

cron任務分為:
系統cron任務:系統維護作業,/etc/crontab 主配置檔案, /etc/cron.d/ 子配置檔案
使用者cron任務:紅帽系統儲存在 /var/spool/cron/USERNAME,Ubuntu系統存放在/var/spool/cron/crontabs/USERNAME,利用 crontab 命令管理
計劃任務日誌:/var/log/cron
[root@localhost ~]# systemctl status crond
[root@localhost ~]# systemctl start crond


crontab -l	 #列出當前使用者的計劃任務
crontab -r	 #刪除當前使用者所有的計劃任務
crontab -e	 #編輯當前使用者的計劃任務
crontab -u meng -e  #使用meng使用者建立
crontab -u meng -l  #檢視meng使用者的計劃任務
管理員可以使用 -u username, 去管理其他使用者的計劃任務


語法格式 :
Minutes   Hours    Day-of-Month    Month    Day-of-Week    Command 
 分鐘	     小時	        日			 月		   周		   執行的命令,最好是命令的絕對路徑
 0-59	  0-23  	  1-31         1-12	      0-7

時間:
*:每
*/5:每隔5分鐘
,:不同的時間段
- : 表示範圍

[root@linux-server ~]# crontab -e	#當前使用者編寫計劃任務

每天6:00執行
0 6 * * *  /home/soso.sh

每天8:40執行
40 8 * * * /home/soso.sh

每週六凌晨4:00執行
0 4 * * 6  /home/soso.sh

每週六凌晨4:05執行
5 4 * * 6  /home/soso.sh 

每週一到週五9:30
30 9 * * 1-5  /home/soso.sh

每週一到週五8:00,每週一到週五9:00
0 8,9 * * 1-5   /home/soso.sh

每天0:30
30 0 * * *    /home/soso.sh

每年6月的週五2:00整
00 02 * 6 5   /home/soso.sh

每月1,5,8號的2:00整
00 02 1,5,8 * *   /home/soso.sh

每月1到8號的2:00整
00 02 1-8 * *   /home/soso.sh


[root@linux-server ~]# crontab -l    #列出計劃任務

範例:
#每日凌晨1點,刪除指定檔案
[root@localhost ~]# crontab -e
[root@localhost spool]# crontab -l
* 1 * * * rm -f /home/meng/file8.txt


#實現定時任務每月月初對指定檔案進行壓縮
#每個月的一號的凌晨1:00執行
[root@localhost ~]# crontab -e
[root@localhost ~]# crontab -l
* 1 * * * rm -f /home/meng/file8.txt
00 1 1 * *  /root/tar.sh


[root@localhost ~]# cat tar.sh
#!/bin/bash

PATH="/root/file.txt"
BACKUP="/root/bakups"
DATE=$(date +\%Y|%m\%d)

mkdir -p $BACKUP

tar -czf $BACKUP/file_$DATE.tar.gz $PATH

[root@localhost ~]# chmod -x /root/tar.sh

相關文章