linux腳本或
Linux繼承了Unix以網路為核心的設計思想,是一個性能穩定的多用戶網路操作系統。有用戶想要在Linux啟動時候自動執行命令腳本,應該怎麼設置呢?這篇文章主要介紹了詳解如何在 Linux 啟動時自動執行命令或腳本,主要有兩種方式,具有一定的參考價值,感興趣的小夥伴們可以參考一下。
方法步驟
在啟動時執行 Linux 腳本
有兩種傳統的方法可以實現在啟動時執行命令或腳本:
方法 #1 - 使用 cron 任務
除了常用格式(分 / 時 / 日 / 月 / 周)外,cron 調度器還支持 @reboot 指令。這個指令後面的參數是腳本(啟動時要執行的那個腳本)的絕對路徑。
然而,這種方法需要注意兩點:
a) cron 守護進程必須處於運行狀態(通常情況下都會運行),同時
b) 腳本或 crontab 文件必須包含需要的環境變數(如果有的話,參考 StackOverflow 獲取更多詳細內容)。
方法 #2 - 使用 /etc/rc.d/rc.local
這個方法對於 systemd-based 發行版 Linux 同樣有效。不過,使用這個方法,需要授予 /etc/rc.d/rc.local 文件執行許可權:
# chmod +x /etc/rc.d/rc.local
然後在這個文件底部添加腳本。
下圖說明如何分別使用 cron 任務和 rc.local 運行兩個示例腳本(/home/gacanepa/script1.sh 和 /home/gacanepa/script2.sh)。
script1.sh:
#!/bin/bash
DATE=$(date +'%F %H:%M:%S')
DIR=/home/gacanepa
echo "Current date and time: $DATE" > $DIR/file1.txt
script2.sh:
#!/bin/bash
SITE="Tecmint.com"
DIR=/home/gacanepa
echo "$SITE rocks... add us to your bookmarks." > $DIR/file2.txt
*啟動時執行 Linux 腳本 *
記住,一定要提前給兩個示例腳本授予執行許可權:
$ chmod +x /home/gacanepa/script1.sh
$ chmod +x /home/gacanepa/script2.sh
在登錄或注銷時執行 Linux 腳本
要在登錄或注銷時執行腳本,分別需要使用 ~.bash_profile 和 ~.bash_logout 文件。多數情況下,後者需要手動創建。在每個文件的底部,添加調用腳本代碼,如前面例中所示,就可以實現這個功能。
補充:Linux基本命令
1.ls命令:
格式::ls [選項] [目錄或文件]
功能:對於目錄,列出該目錄下的所有子目錄與文件;對於文件,列出文件名以及其他信息。
常用選項:
-a :列出目錄下的所有文件,包括以 . 開頭的隱含文件。
-d :將目錄像文件一樣顯示,而不是顯示其他文件。
-i :輸出文件的i節點的索引信息。
-k :以k位元組的形式表示文件的大小。
-l :列出文件的詳細信息。
-n :用數字的UID,GID代替名稱。
-F : 在每個文件名後面附上一個字元以說明該文件的類型,“*”表示可執行的普通文 件;“/”表示目錄;“@”表示符號鏈接;“l”表示FIFOS;“=”表示套接字。
2.cd命令
格式:cd [目錄名稱]
常用選項:
cd .. 返回上一級目錄。
cd ../.. 將當前目錄向上移動兩級。
cd - 返回最近訪問目錄。
3.pwd命令
格式: pwd
功能:顯示出當前工作目錄的絕對路徑。
相關閱讀:Linux主要特性
完全兼容POSIX1.0標准
這使得可以在Linux下通過相應的模擬器運行常見的DOS、Windows的程序。這為用戶從Windows轉到Linux奠定了基礎。許多用戶在考慮使用Linux時,就想到以前在Windows下常見的程序是否能正常運行,這一點就消除了他們的疑慮。
多用戶、多任務
Linux支持多用戶,各個用戶對於自己的文件設備有自己特殊的權利,保證了各用戶之間互不影響。多任務則是現在電腦最主要的一個特點,Linux可以使多個程序同時並獨立地運行。
良好的界面
Linux同時具有字元界面和圖形界面。在字元界面用戶可以通過鍵盤輸入相應的指令來進行操作。它同時也提供了類似Windows圖形界面的X-Window系統,用戶可以使用滑鼠對其進行操作。在X-Window環境中就和在Windows中相似,可以說是一個Linux版的Windows。
支持多種平台
2. linux 腳本這是什麼意思
linux腳本是文本格式的,由各類shell解釋執行。所以你那些碼根本就不是腳本。
3. 讓Linux系統保持活力的優化腳本
筆者從生產系統上和網路資料上總結出幾種優化腳本,腳本從磁碟和內存方面入手,讓Linux系統保持活力。特別是第三種清理緩存釋放內存,可以結合筆者以前的文章-Linux健康檢查腳本health-check-script來做進一步的包裝,特別是在做大量數據備份之後,完成自動檢測和清理工作。
下面的delete_data函數中的三條命令可以完成目錄下所有文件、log文件和log.gz文件按過期時間清理。
delete_data()
{
delete_time=$1
#清理目錄下所有過期文件
find /home/pi/log/ -mtime +$delete_time -exec rm -r {} \;
#清理目錄下.log過期文件
find /home/pi/log/ -mtime +$delete_time -name '*.log' -exec rm -r {} \;
#清理目錄下.log.gz過期文件
find /home/pi/log/ -mtime +$delete_time -name '*.log.gz' -exec rm -r {} \;
}
2.1目錄下文件單獨壓縮打包
#將/home/pi/log/目錄下的.log文件打包成.gz文件,
find /home/pi/log/ -name '*.log' -exec gzip -f {} \;
運行測試,默認gzip 會刪除源文件,並生成xx.gz文件。
zcat filename.gz 可以直接查看文件內容。gunzip –c filename.gz 可以解壓縮並保留源文件,但是解壓後顯示在標准輸出上,沒有解壓後文件。gunzip -cv filename.gz > filename ,可以保留源文件和壓縮後文件,-v是顯示進度。壓縮保留源文件是 gzip -cv filename > filename.gz 。
2.2目錄下文件以前一起打包壓縮
gzip無法壓縮文件夾,僅用於壓縮單個文件,要壓縮文件夾,應該使用tar + gzip ,即是tar -z。
#將log目錄下的文件打包並以時間命令,打包後以 gzip 壓縮
tar -zcvf $(date +%Y%m%d%H%M%S)log.tar.gz log/
tar -ztvf log.tar.gz可以查看包內有哪些文件。
tar -zxvf 20210219143137log.tar.gz 解壓縮到當前目錄
tar -zxvf 20210219143137log.tar.gz -C log2/ 將包解壓到log2目錄下。
頻繁的文件訪問(特別是數據備份後)會導致系統的Cache使用量大增。sysctl命令用於運行時配置內核參數,這些參數位於/proc/sys目錄下。
這里我們來看一下 buff/cache的作用。
buffer指Linux內存的 緩沖區緩存 Buffer cache,cache指Linux內存中的 頁面緩存 Page cache。
Cache(Page cache,頁面緩存): 主要用來作為文件系統上的文件數據的緩存來用,尤其是針對當進程對文件有read/write操作的時候。
Buffer(Buffer cache,緩沖區緩存): 主要是針對塊設備進行緩存的,比如當我們對一個文件進行寫操作的時候,page cache的內容會被改變,而buffer cache則可以用來將page標記為不同的緩沖區,並記錄是哪一個緩沖區被修改了。這樣,內核在後續執行臟數據的回寫(writeback)時,就不用將整個page寫回,而只需要寫回修改的部分即可。
Linux內核會在內存將要耗盡的時候,觸發內存回收的工作,以便釋放出內存給急需內存的進程使用。怎麼手動清除呢?修改/proc/sys/vm/drop_caches 的值。看看英語說明:
to free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 > /proc/sys/vm/drop_caches.
即3可以釋放所有類型的緩存。
同時為了防止數據丟失,命令sync 將臟頁的內容寫回硬碟,但可能伴隨著系統磁碟IO飆高。
運行free -m命令,再運行下面的腳本中的命令,發現 buff/cache減少了21M。
4. 在linux下shell腳本中if中用到or怎麼寫
linux下shell腳本的邏輯的or用運算符 || 表示,if中用到or的寫法實例如下:
a=10
b=20
if[[$a-lt 50||$b-gt 50]]
then
echo"返回 true"
else
echo"返回 false"
fi
其中$a-lt100表示a<50 為真;$b-gt 50 表示b>50為假;真 or 假為真。
所以輸出結果為:返回 true
(4)linux腳本或擴展閱讀
1、shell中流程式控制制if基本語法介紹:
if condition
then
command1
command2 ...
commandN
fi
2、shell中的另一個邏輯運算符and (&&)用法實例介紹:
a=10
b=20
if[[$a-lt100&&$b-gt100]]
then
echo"返回 true"
else
echo"返回 false"
fi
輸出結果為:返回 false
5. linux 中怎樣執行腳本
首先腳本需要有執行許可權
chmo+xfile.sh
執行腳本有三種方法:
1../file.sh
特點:開啟bash子進程來執行,也就是開啟額外的進程來進行,不影響原進程的變數、配置等
2.bashfile.sh
特點:和./file.sh相同
3.sourcefile.sh或者.file.sh
特點:在原bash進程中執行腳本。
第三種方法主要用於在腳本中切換用戶su、切換目錄cd等命令。
source和.命令是相同的。
你可以搜索source
補充,如何查看腳本運行是否開啟了bash子進程
vim file.sh
寫入
#!/bin/bash
#echo $$命令會輸出bash進程ID
echo $$
保存並賦予可執行許可權chmod u+x file.sh
在你的shell中輸入,echo $$ 屏幕輸出4176
./file.sh 屏幕輸出3600
bash file.sh 屏幕輸出3984
source file.sh 屏幕輸出4176 和 你直接在shell中輸出的一樣,說明是在同一個bash進程
6. Linux命令或腳本備份文件
2樓說得太玄乎了。
其實很好解決,每次文件被更新後,文件的時間戳也會更新,根據文件的時間戳即可確定該文件是否被更新過。
如果你使用的是redhat,它將cp命令進行過alias,導致cp
-f命令無法去掉提示,因此執行時需要直接調用/bin/cp執行即可,腳本如下:
#!/bin/bash
/bin/cp
-auf
/A/*
/B
7. linux腳本學習-推薦
1. Linux 腳本編寫基礎1.1 語法基本介紹1.1.1 開頭程序必須以下面的行開始(必須方在文件的第一行):#!/bin/sh符號#!用來告訴系統它後面的參數是用來執行該文件的程序。在這個例子中我們使用/bin/sh來執行程序。當編輯好腳本時,如果要執行該腳本,還必須使其可執行。要使腳本可執行:編譯 chmod +x filename 這樣才能用./filename 來運行1.1.2 注釋在進行shell編程時,以#開頭的句子表示注釋,直到這一行的結束。我們真誠地建議您在程序中使用注釋。如果您使用了注釋,那麼即使相當長的時間內沒有使用該腳本,您也能在很短的時間內明白該腳本的作用及工作原理。1.1.3 變數在其他編程語言中您必須使用變數。在shell編程中,所有的變數都由字元串組成,並且您不需要對變數進行聲明。要賦值給一個變數,您可以這樣寫:#!/bin/sh#對變數賦值:a="hello world"# 現在列印變數a的內容:echo "A is:"echo $a有時候變數名很容易與其他文字混淆,比如:num=2echo "this is the $numnd"這並不會列印出"this is the 2nd",而僅僅列印"this is the ",因為shell會去搜索變數numnd的值,但是這個變數時沒有值的。可以使用花括弧來告訴shell我們要列印的是num變數:num=2echo "this is the ${num}nd"這將列印: this is the 2nd1.1.4 環境變數由export關鍵字處理過的變數叫做環境變數。我們不對環境變數進行討論,因為通常情況下僅僅在登錄腳本中使用環境變數。1.1.5 Shell命令和流程式控制制在shell腳本中可以使用三類命令:1)Unix 命令:雖然在shell腳本中可以使用任意的unix命令,但是還是由一些相對更常用的命令。這些命令通常是用來進行文件和文字操作的。常用命令語法及功能echo "some text": 將文字內容列印在屏幕上ls: 文件列表wc –l filewc -w filewc -c file: 計算文件行數計算文件中的單詞數計算文件中的字元數cp sourcefile destfile: 文件拷貝mv oldname newname : 重命名文件或移動文件rm file: 刪除文件grep 'pattern' file: 在文件內搜索字元串比如:grep 'searchstring' file.txtcut -b colnum file: 指定欲顯示的文件內容範圍,並將它們輸出到標准輸出設備比如:輸出每行第5個到第9個字元cut -b5-9 file.txt千萬不要和cat命令混淆,這是兩個完全不同的命令cat file.txt: 輸出文件內容到標准輸出設備(屏幕)上file somefile: 得到文件類型read var: 提示用戶輸入,並將輸入賦值給變數sort file.txt: 對file.txt文件中的行進行排序uniq: 刪除文本文件中出現的行列比如: sort file.txt | uniqexpr: 進行數學運算Example: add 2 and 3expr 2 "+" 3find: 搜索文件比如:根據文件名搜索find . -name filename -printtee: 將數據輸出到標准輸出設備(屏幕) 和文件比如:somecommand | tee outfilebasename file: 返回不包含路徑的文件名比如: basename /bin/tux將返回 tuxdirname file: 返迴文件所在路徑比如:dirname /bin/tux將返回 /binhead file: 列印文本文件開頭幾行tail file : 列印文本文件末尾幾行sed: Sed是一個基本的查找替換程序。可以從標准輸入(比如命令管道)讀入文本,並將結果輸出到標准輸出(屏幕)。該命令採用正則表達式(見參考)進行搜索。不要和shell中的通配符相混淆。比如:將linuxfocus 替換為LinuxFocus :cat text.file | sed 's/linuxfocus/LinuxFocus/' > newtext.fileawk: awk 用來從文本文件中提取欄位。預設地,欄位分割符是空格,可以使用-F指定其他分割符。cat file.txt | awk -F, '{print $1 "," $3 }'這里我們使用,作為欄位分割符,同時列印第一個和第三個欄位。如果該文件內容如下: Adam Bor, 34, IndiaKerry Miller, 22, USA命令輸出結果為:Adam Bor, IndiaKerry Miller, USA2) 概念: 管道, 重定向和 backtick這些不是系統命令,但是他們真的很重要。管道 (|) 將一個命令的輸出作為另外一個命令的輸入。grep "hello" file.txt | wc -l在file.txt中搜索包含有」hello」的行並計算其行數。在這里grep命令的輸出作為wc命令的輸入。當然您可以使用多個命令。重定向:將命令的結果輸出到文件,而不是標准輸出(屏幕)。> 寫入文件並覆蓋舊文件>> 加到文件的尾部,保留舊文件內容。反短斜線 使用反短斜線可以將一個命令的輸出作為另外一個命令的一個命令行參數。命令:find . -mtime -1 -type f -print用來查找過去24小時(-mtime –2則表示過去48小時)內修改過的文件。如果您想將所有查找到的文件打一個包,則可以使用以下腳本:#!/bin/sh# The ticks are backticks (`) not normal quotes ('):tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`3) 流程式控制制1.if"if" 表達式 如果條件為真則執行then後面的部分:if ....; then ....elif ....; then ....else ....fi大多數情況下,可以使用測試命令來對條件進行測試。比如可以比較字元串、判斷文件是否存在及是否可讀等等…通常用" [ ] "來表示條件測試。注意這里的空格很重要。要確保方括弧的空格。[ -f "somefile" ] :判斷是否是一個文件[ -x "/bin/ls" ] :判斷/bin/ls是否存在並有可執行許可權[ -n "$var" ] :判斷$var變數是否有值[ "$a" = "$b" ] :判斷$a和$b是否相等執行man test可以查看所有測試表達式可以比較和判斷的類型。直接執行以下腳本:#!/bin/shif [ "$SHELL" = "/bin/bash" ]; thenecho "your login shell is the bash (bourne again shell)"elseecho "your login shell is not bash but $SHELL"fi變數$SHELL包含了登錄shell的名稱,我們和/bin/bash進行了比較。快捷操作符熟悉C語言的朋友可能會很喜歡下面的表達式:[ -f "/etc/shadow" ] && echo "This computer uses shadow passwors"這里 && 就是一個快捷操作符,如果左邊的表達式為真則執行右邊的語句。您也可以認為是邏輯運算中的與操作。上例中表示如果/etc/shadow文件存在則列印」 This computer uses shadow passwors」。同樣或操作(||)在shell編程中也是可用的。這里有個例子:#!/bin/shmailfolder=/var/spool/mail/james[ -r "$mailfolder" ]' '{ echo "Can not read $mailfolder" ; exit 1; }echo "$mailfolder has mail from:"grep "^From " $mailfolder該腳本首先判斷mailfolder是否可讀。如果可讀則列印該文件中的"From" 一行。如果不可讀則或操作生效,列印錯誤信息後腳本退出。這里有個問題,那就是我們必須有兩個命令:-列印錯誤信息-退出程序我們使用花括弧以匿名函數的形式將兩個命令放到一起作為一個命令使用。一般函數將在下文提及。不用與和或操作符,我們也可以用if表達式作任何事情,但是使用與或操作符會更便利很多。2.casecase :表達式可以用來匹配一個給定的字元串,而不是數字。case ... in...) do something here ;;esac讓我們看一個例子。 file命令可以辨別出一個給定文件的文件類型,比如:file lf.gz這將返回:lf.gz: gzip compressed data, deflated, original filename,last modified: Mon Aug 27 23:09:18 2001, os: Unix我們利用這一點寫了一個叫做smartzip的腳本,該腳本可以自動解壓bzip2, gzip 和zip 類型的壓縮文件:#!/bin/shftype=`file "$1"`case "$ftype" in"$1: Zip archive"*)unzip "$1" ;;"$1: gzip compressed"*)gunzip "$1" ;;"$1: bzip2 compressed"*)bunzip2 "$1" ;;*) echo "File $1 can not be uncompressed with smartzip";;esac您可能注意到我們在這里使用了一個特殊的變數$1。該變數包含了傳遞給該程序的第一個參數值。也就是說,當我們運行:smartzip articles.zip$1 就是字元串 articles.zip3. selsectselect 表達式是一種bash的擴展應用,尤其擅長於互動式使用。用戶可以從一組不同的值中進行選擇。select var in ... ; dobreakdone.... now $var can be used ....下面是一個例子:#!/bin/shecho "What is your favourite OS?"select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; dobreakdoneecho "You have selected $var"下面是該腳本運行的結果:What is your favourite OS?1) Linux2) Gnu Hurd3) Free BSD4) Other#? 1You have selected Linux4.looploop表達式:while ...; do....donewhile-loop 將運行直到表達式測試為真。will run while the expression that we test for is true.關鍵字"break" 用來跳出循環。而關鍵字」continue」用來不執行餘下的部分而直接跳到下一個循環。
8. linux 中如何執行腳本
首先腳本需要有執行許可權
chmod u+x file.sh
執行腳本有三種方法:
1. ./file.sh
特點:開啟bash子進程來執行,也就是開啟額外的進程來進行,不影響原進程的變數、配置等
2. bash file.sh
特點:和./file.sh相同
3. source file.sh 或者 . file.sh
特點:在原bash進程中執行腳本。
第三種方法主要用於在腳本中切換用戶su、切換目錄cd等命令。
source 和 . 命令是相同的。
你可以搜索 source
補充,如何查看腳本運行是否開啟了bash子進程
1.
vim
file.sh
2.
寫入
#!/bin/bash
#echo
$$命令會輸出bash進程id
echo
$$
3.
保存並賦予可執行許可權chmod
u+x
file.sh
4.
在你的shell中輸入,echo
$$
屏幕輸出4176
5.
./file.sh
屏幕輸出3600
6.
bash
file.sh
屏幕輸出3984
7.
source
file.sh
屏幕輸出4176
和
你直接在shell中輸出的一樣,說明是在同一個bash進程
9. 求一個Linux的shell腳本或者程序
1.1 什麼是shell?
Shell是一個命令解釋器,它在操作系統的最外層,負責直接與用戶進行對話,把用戶的輸入解釋給操作系統,並處理各種各樣的操作系統的輸出結果,輸出到屏幕反饋給用戶。這種對話方式可以是互動式也可以是非互動式的
我們所輸入的命令計算機是不識別的,這時就需要一種程序來幫助我們進行翻譯,變成計算機能識別的二進製程序,同時又把計算機生成的結果返回給我們。
當前終端使用的哪種shell?
大多數linux發行版本默認shell使用的是bash
1.2 擴展:編程語言分類
編程語言主要用:低級語言和高級語言
1)低級語言:
機器語言:二進制語言
匯編語言:符號語言,使用助記符來代替操作碼,也就是用符號代替機器語言的二進制碼
它們都是面向機器的語言
2)高級語言:
它是比較接近自然語言或者說人類語言的一種編程,用人們能夠容易理解的方式進行編寫程序,
靜態語言:編譯型語言如:c 、c++ 、java,
動態語言:解釋型語言如:php 、shell 、python 、perl
gcc編譯器:(解釋器) 將人類理解的語言翻譯成機器理解的語言
靜態語言和動態語言的區別:
靜態語言編譯時,變數的數據類型是確定的,靜態語言對硬體更友好,運行效率更高。
動態語言,運行時確定變數的數據類型,且運行時可改變變數的類型。動態語言更簡潔,對人類更友好,可以把更多精力放在業務邏輯上。
10. linux 中如何執行腳本
ash shell 腳本的方法有多種,現在作個小結。假設我們編寫好的shell腳本的文件名為hello.sh,文件位置在/data/shell目錄中並已有執行許可權。
方法一:切換到shell腳本所在的目錄(此時,稱為工作目錄)執行shell腳本:
cd /data/shell
./hello.sh
./的意思是說在當前的工作目錄下執行hello.sh。如果不加上./,bash可能會響應找到不到hello.sh的錯誤信息。因為目前的工作目錄(/data/shell)可能不在執行程序默認的搜索路徑之列,也就是說,不在環境變數PASH的內容之中。查看PATH的內容可用 echo $PASH 命令。現在的/data/shell就不在環境變數PASH中的,所以必須加上./才可執行。
方法二:以絕對路徑的方式去執行bash shell腳本:
/data/shell/hello.sh
方法三:直接使用bash 或sh 來執行bash shell腳本:
cd /data/shell
bash hello.sh
或
cd /data/shell
sh hello.sh
注意,若是以方法三的方式來執行,那麼,可以不必事先設定shell的執行許可權,甚至都不用寫shell文件中的第一行(指定bash路徑)。因為方法三是將hello.sh作為參數傳給sh(bash)命令來執行的。這時不是hello.sh自己來執行,而是被人家調用執行,所以不要執行許可權。那麼不用指定bash路徑自然也好理解了啊,呵呵……。
方法四:在當前的shell環境中執行bash shell腳本:
cd /data/shell
. hello.sh
或
cd /data/shell
source hello.sh
前三種方法執行shell腳本時都是在當前shell(稱為父shell)開啟一個子shell環境,此shell腳本就在這個子shell環境中執行。shell腳本執行完後子shell環境隨即關閉,然後又回到父shell中。而方法四則是在當前shell中執行的。