linux脚本for使用(linux for 脚本)
linux下怎么運(yùn)行bash腳本?
sh filename.sh 你也可以直接 ./filename 注意前面的==> ./ <== 不過(guò)你首先要ls -l確定一下這個(gè)文件又沒(méi)有執(zhí)行權(quán)限。
Linux中,shell腳本如何使用信號(hào)機(jī)制去控制線程的開(kāi)啟關(guān)閉?
trap是Linux的內(nèi)建命令,用于捕捉信號(hào),trap命令可以指定收到某種信號(hào)時(shí)所執(zhí)行的命令。trap命令的格式如下:trap command sig1 sig2 ... sigN,當(dāng)接收到sinN中任意一個(gè)信號(hào)時(shí),執(zhí)行command命令,command命令完成后繼續(xù)接收到信號(hào)前的操作,直到腳本結(jié)束。 利用trap命令捕捉INT信號(hào)(即與Ctrl+c綁定的中斷信號(hào))。trap還可以忽略某些信號(hào),將command用空字符串代替即可,如trap "" TERM INT,忽略kill %n和Ctrl+c發(fā)送的信號(hào)(kill發(fā)送的是TERM信號(hào))。Linux更強(qiáng)勁的殺死進(jìn)程的命令:kill -9 進(jìn)程號(hào)(或kill -9 %n作業(yè)號(hào))等價(jià)與kill -KILL 進(jìn)程號(hào)。
舉個(gè)例子
:
最近小A需要生產(chǎn)2015年全年的KPI數(shù)據(jù)報(bào)表,現(xiàn)在小A已經(jīng)將生產(chǎn)腳本寫(xiě)好了,生產(chǎn)腳本一次只能生產(chǎn)指定一天的KPI數(shù)據(jù),假設(shè)跑一次生產(chǎn)腳本需要5分鐘,那么:
如果是循環(huán)順序執(zhí)行,那么需要時(shí)間:5 * 365 = 1825 分鐘,約等于 6 天
如果是一次性放到linux后臺(tái)并發(fā)執(zhí)行,365個(gè)后臺(tái)任務(wù),系統(tǒng)可承受不住哦!
既然不能一次性把365個(gè)任務(wù)放到linux后臺(tái)執(zhí)行,那么,能不能實(shí)現(xiàn)自動(dòng)地每次將N個(gè)任務(wù)放到后臺(tái)并發(fā)執(zhí)行呢?當(dāng)然是可以的啦。
#! /bin/bash
source /etc/profile;
# -----------------------------
tempfifo=$$.fifo # $$表示當(dāng)前執(zhí)行文件的PID
begin_date=$1 # 開(kāi)始時(shí)間
end_date=$2 # 結(jié)束時(shí)間
if
then
if
then
echo "Error! $begin_date is greater than $end_date"
exit 1;
fi
else
echo "Error! Not enough params."
echo "Sample: sh loop_kpi 2015-12-01 2015-12-07"
exit 2;
fi
# -----------------------------
trap "exec 1000>&-;exec 1000
mkfifo $tempfifo
exec 1000$tempfifo
rm -rf $tempfifo
for ((i=1; i
do
echo >&1000
done
while
do
read -u1000
{
echo $begin_date
hive -f kpi_report.sql --hivevar date=$begin_date
echo >&1000
} &
begin_date=`date -d "+1 day $begin_date" +"%Y-%m-%d"`
done
wait
echo "done!!!!!!!!!!"
第6~22行:比如:sh loop_kpi_report.sh 2015-01-01 2015-12-01:
$1表示腳本入?yún)⒌牡谝粋€(gè)參數(shù),等于2015-01-01
$2表示腳本入?yún)⒌牡诙€(gè)參數(shù),等于2015-12-01
$#表示腳本入?yún)⒌膫€(gè)數(shù),等于2
第13行用于比較傳入的兩個(gè)日期的大小,>是轉(zhuǎn)義
第26行:表示在腳本運(yùn)行過(guò)程中,如果接收到Ctrl+C中斷命令,則關(guān)閉文件描述符1000的讀寫(xiě),并正常退出
exec 1000>&-;表示關(guān)閉文件描述符1000的寫(xiě)
exec 1000
trap是捕獲中斷命令
第27~29行:
第27行,創(chuàng)建一個(gè)管道文件
第28行,將文件描述符1000與FIFO進(jìn)行綁定,寫(xiě)的綁定,則標(biāo)識(shí)對(duì)文件描述符1000的所有操作等同于對(duì)管道文件$tempfifo的操作
第29行,可能會(huì)有這樣的疑問(wèn):為什么不直接使用管道文件呢?事實(shí)上這并非多此一舉,管道的一個(gè)重要特性,就是讀寫(xiě)必須同時(shí)存在,缺失某一個(gè)操作,另一個(gè)操作就是滯留,而第28行的綁定文件描述符(讀、寫(xiě)綁定)正好解決了這個(gè)問(wèn)題
第31~34行:對(duì)文件描述符1000進(jìn)行寫(xiě)入操作。通過(guò)循環(huán)寫(xiě)入8個(gè)空行,這個(gè)8就是我們要定義的后臺(tái)并發(fā)的線程數(shù)。為什么是寫(xiě)空行而不是寫(xiě)其它字符?因?yàn)楣艿牢募淖x取,是以行為單位的
第37~42行:
第37行,read -u1000的作用就是讀取管道中的一行,在這里就是讀取一個(gè)空行;每次讀取管道就會(huì)減少一個(gè)空行
第39~41行,注意到第42行結(jié)尾的&嗎?它表示進(jìn)程放到linux后臺(tái)中執(zhí)行
第41行,執(zhí)行完后臺(tái)任務(wù)之后,往文件描述符1000中寫(xiě)入一個(gè)空行。這是關(guān)鍵所在了,由于read -u1000每次操作,都會(huì)導(dǎo)致管道減少一個(gè)空行,當(dāng)linux后臺(tái)放入了8個(gè)任務(wù)之后,由于文件描述符1000沒(méi)有可讀取的空行,將導(dǎo)致read -u1000一直處于等待。
linux運(yùn)行腳本不需要什么權(quán)限?
運(yùn)行腳本需要權(quán)限,需要可執(zhí)行權(quán)限。
linux編寫(xiě)腳本權(quán)限不夠怎么解決?
權(quán)限不夠可以通過(guò)su命令切換到root用戶(hù)來(lái)運(yùn)行命令。需要輸入root用戶(hù)的密碼。
用法示例:切換到root用戶(hù)$ su方法二:使用sudo命令,針對(duì)單個(gè)命令授予臨時(shí)權(quán)限。sudo僅在需要時(shí)授予用戶(hù)權(quán)限,減少了用戶(hù)因?yàn)殄e(cuò)誤執(zhí)行命令損壞系統(tǒng)的可能性。
sudo也可以用來(lái)以其他用戶(hù)身份執(zhí)行命令。
總結(jié)
以上是生活随笔為你收集整理的linux脚本for使用(linux for 脚本)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机文化基础分析总结,《计算机文化基础
- 下一篇: window7连接其他计算机的打印机,w