linux 函式和指令碼

2021-10-06 23:22:09 字數 4096 閱讀 7136

// function 可以省略 ; fname 為函式的名稱

function fname()

函式的執行 :fname

定義乙個名為 12.sh 的函式指令碼

#!/bin/bash

# function

# local 定義的物件只能在函式類起作用(區域性變數)

checkid(

)

執行上面的sh函式指令碼

## 賦予當前使用者 12.sh的執行許可權

$ chmod u+x 12.sh

## 定義12.sh在當前程序下執行 (或者使用 ./12.sh )

$ source 12.sh

## 執行checkid 函式 判斷執行緒 1 是否存在

$ checkid 1

$ echo

$?# 結果:0

可以使用nice和renice 調整指令碼優先順序

避免出現「不可控的」死迴圈

死迴圈導致cpu占用過高

死迴圈導致宕機

linux ulimit命令用於控制shell程式的資源。

ulimit為shell內建指令,可用來控制shell執行程式的資源。

fork炸彈(大量建立子程序): .();. 或者 func() ;func

其中 func 是乙個函式名稱(隨意起的)

## 設定單一使用者程式上限

$ ulimit -u 500

## 顯示系統資源的設定

$ ulimit -a

kill缺省會傳送15號訊號給應用程式

ctrl+c傳送2號訊號給應用程式

9號訊號不可阻塞

建立 1.sh :

#!/bin/bash

# single demo

trap

" echo sig 15 " 15

trap

" echo sig 2 " 2

echo $$

while:do

:done

## 

$ sh 1.sh

## ctrl + c (在此不能結束 指令碼的執行 ,因為1.sh中捕獲了 2 號命令)

# 結果:

# 32563 執行的程序號(pid)

# sig 15 (kill -15 32563 結果)

# sig 2 (ctrl + c 結果)

# killed (kill -9 32563 結果)

$ kill -15 32563

$ kill -9 32563

參考:linux之一次性(at)計畫任務及週期性(crontab)計畫任務

在指定的日期、時間點自動的執行預先設定的一些命令操作,屬於一次性計畫任務

系統服務的名稱:/etc/init.d/atd

設定格式:at [hh:mm] [yyyy-mm-dd]

atq命令:查詢當前設定的at任務列表 同 at -l

atrm命令:刪除指定任務編號的at任務 atrm 編號 同 at -d

at -c 任務號 檢視計畫任務的具體內容(和at計畫任務檔案/var/spool/at/以a開頭的檔案內容相同)

at 命令常用格式:

at   [hh:mm]

at [hh:mm]

[yyyy-mm-dd]

at now +數字 [minutes|hours|days|weeks]

at 時間 -f 檔案 使用檔案中的命令作為計畫任務

at now +5 minutes -f /root/test.sh

## 建立計畫任務

[root@rhel3 ~]

# at 02:35

at>

ls /tmp

at>

job 4 at 2019-03-29 02:35

## 檢視計畫任務

[root@rhel3 ~]

# at -l

4 2019-03-29 02:35 a root

按照預先設定的時間週期(分鐘、小時、天…)重複執行使用者執行的命令操作,這屬於週期計畫人任務

服務名稱:/etc/init.d/crond

主要設定檔案:使用者定義的設定,位於檔案/etc/spool/cron/使用者名稱

cron服務配置檔案:/etc/crontab(包含三部分:注釋、環境變數、cron命令)

注意:crond計畫任務裡的命令有時可能不被執行,因為cron的環境變數path 跟系統的path 不太一樣,它的path 路徑預設值為:path=/sbin:/bin:/usr/sbin:/usr/bin,所以這就造成很多命令不能使用,解決辦法:1、自己設定cron的path環境變數 2、用命令的絕對路徑,如ls我們可以使用: /bin/ls

cron服務日誌檔案:/var/log/cron

管理cron計畫任務:

編輯計畫任務:crontab -e [-u 使用者名稱]

檢視計畫任務:crontab -l [-u 使用者名稱]

刪除計畫任務:crontab -r [-u 使用者名稱 ]

##

$ crontab -e

$ * * * * * /usr/bin/date >> /tmp/date.txt

## cron的執行日誌在 /var/log 目錄下 ,檔案為cron

$ cd /var/log |

tail -n 100 cron

參考:linux檔案鎖flock

anacontab延時計畫任務

flock 鎖檔案

用linux flock 檔案鎖實現任務鎖定,解決衝突

-s, --shared: 獲得乙個共享鎖

-x, --exclusive: 獲得乙個獨佔鎖

-u, --unlock: 移除乙個鎖,通常是不需要的,指令碼執行完會自動丟棄鎖

-n, --nonblock: 如果沒有立即獲得鎖,直接失敗而不是等待

-w, --timeout: 如果沒有立即獲得鎖,等待指定時間

-o, --close: 在執行命令前關閉檔案的描述符號。用於如果命令產生子程序時會不受鎖的管控

-c, --command: 在shell中執行乙個單獨的命令

-h, --help 顯示幫助

-v, --version: 顯示版本

元字元擴充套件元字元

檔案的查詢命令find

文字內容的過濾(查詢)grep

字串 do one thing at a time,and do well.

匹配字元 an

元字元:

. 匹配除換行符外的任意單個字元

## 

$ grep password /root/anaconda-ks.cfg

## .... 表示4個任意字元

$ grep pass..

.. /root/anaconda-ks.cfg

## pass.... 長度為7,以pass開頭後面4個結束

$ grep pass..

..$ /root/anaconda-ks.cfg

## pass開頭的任意字元。。。

$ grep pass.* /root/anaconda-ks.cfg

$ grep

[pp]ass.* /root/anaconda-ks.cfg

$ grep ^# /root/anaconda-ks.cfg

## 匹配 . 號

$ grep

"/." /root/anaconda-ks.cfg

擴充套件元字元:

+匹配前面的正規表示式至少出現一次

?匹配前面的正規表示式出現零次或一次

|匹配它前面或後面的正規表示式

$ find /etc -name pass*

$ find /etc -regex .*wd

linux指令碼 函式和引數

如何定義乙個引數?function fname statements 或者fname statemants 即可 執行函式 fname 執行函式 傳遞引數 fname arg1 arg2 傳遞引數 我們可以在函式中使用引數 fname echo 1 2 列印第乙個和第二個引數 echo 列印全部引數...

linux 指令碼 函式編寫

為增加 復用性,建立函式 函式1,func1.sh 同一指令碼內呼叫 bin bash 定義變數 user aaa display display source func1.sh 到入庫 或者 func1.sh 函式2,func2.sh 跨指令碼呼叫 bin bash 引入外部指令碼 使用sourc...

shell指令碼 迴圈和函式

1 列印乙個等腰三角形 bin bash for i in seq 10 do for j in seq 10 i do echo n done for k in seq i 2 1 do echo n done echo done 2 列印99乘法表 bin bash for i in do fo...