目錄
- 虛擬機器聯網
- 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