腳本信號
A. 每天三分鍾搞定linux shell腳本24 後台模式運行
當運行腳本的時候在最後加上符號 & ,則對應的腳本在 後台運行 。建立腳本為,
輸入 ./test.sh & 運行
運行後1.txt文件會不斷增加內容,但是腳本以後台運行不會在終端佔用。運行結果為:
輸入 jobs 可以看到這個後台進程:
這個時候如果輸入exit,不會提示有後台進程在運行,而且後台進程也會退出。因為終端會話退出的時候會給這個後台進程發送一個 SIGHUP信號 。如果想要終端退出之後,進程不退出,可以讓進程捕獲SIGHUP信號。當然還有另一個方法,使用 nohup 指令運行腳本,比如輸入:
當用 nohup 並使用後台模式運行之後,即使退出終端,進程也不會收到SIGHUP信號。並且nohup會自動把標准輸出和標准錯誤重定向到nohup.out的文件中。
一個 運行的進程或者暫停的進程 都是一個作業,使用 jobs 命令可以查看當前的作業狀態。輸入:
我當前的輸出為:
(上面的作業2是輸入 ctrl+z 後暫停的進程)
其中, + 號被當作是默認作業,每個作業的前面有自己的序號。如果後續操作不加序號,那麼就被當做是在操作默認作業。比如使用 fg 指令前台運行作業,就是把27652這個進程前台運行,如果輸入 fg 1 ,那麼就是操作作業 1 了。帶-號的表示下一個默認作業。
輸入 bg 1 把 1號作業 後台運行,輸入 fg 2 把 2號作業 前台運行。
B. shell腳本中如何捕捉鍵盤輸入的字元信號
舉個例子:
做Docker構建鏡像的練習,寫了下面這個 Dockerfile 文件,其中 yum install tomcat 執行過程中需要用鍵盤輸入兩次字元」y」以便確認選項,Dockerfile 腳本命令如下:
FROM centos
MAINTAINER quicmous "[email protected]"
RUN yes y | head -2 | yum install tomcat -y
RUN echo 'Hi, I am in your container'
EXPOSE 8012345
其中 yes 命令可以無限重復產生其後面的字元」y」,head 命令只選擇其中兩次重復輸入,也就是兩個字元」y」。命令行
yes y | head -2 | yum install tomcat -y
可以自動完成全部操作,中間過程不需要人工干預。
C. Linux中,shell腳本如何使用信號機制去控制線程的開啟關閉
trap是Linux的內建命令,用於捕捉信號,trap命令可以指定收到某種信號時所執行的命令。trap命令的格式如下:trap command sig1 sig2 ... sigN,當接收到sinN中任意一個信號時,執行command命令,command命令完成後繼續接收到信號前的操作,直到腳本結束。利用trap命令捕捉INT信號(即與Ctrl+c綁定的中斷信號)。trap還可以忽略某些信號,將command用空字元串代替即可,如trap "" TERM INT,忽略kill %n和Ctrl+c發送的信號(kill發送的是TERM信號)。Linux更強勁的殺死進程的命令:kill -9 進程號(或kill -9 %n作業號)等價與kill -KILL 進程號。
舉個例子:
最近小A需要生產2015年全年的KPI數據報表,現在小A已經將生產腳本寫好了,生產腳本一次只能生產指定一天的KPI數據,假設跑一次生產腳本需要5分鍾,那麼:
如果是循環順序執行,那麼需要時間:5 * 365 = 1825 分鍾,約等於 6 天
如果是一次性放到linux後台並發執行,365個後台任務,系統可承受不住哦!
既然不能一次性把365個任務放到linux後台執行,那麼,能不能實現自動地每次將N個任務放到後台並發執行呢?當然是可以的啦。
#!/bin/bash
source/etc/profile;
#-----------------------------
tempfifo=$$.fifo#$$表示當前執行文件的PID
begin_date=$1#開始時間
end_date=$2#結束時間
if[$#-eq2]
then
if["$begin_date">"$end_date"]
then
echo"Error!$begin_dateisgreaterthan$end_date"
exit1;
fi
else
echo"Error!Notenoughparams."
echo"Sample:shloop_kpi2015-12-012015-12-07"
exit2;
fi
#-----------------------------
trap"exec1000>&-;exec1000<&-;exit0"2
mkfifo$tempfifo
exec1000<>$tempfifo
rm-rf$tempfifo
for((i=1;i<=8;i++))
do
echo>&1000
done
while[$begin_date!=$end_date]
do
read-u1000
{
echo$begin_date
hive-fkpi_report.sql--hivevardate=$begin_date
echo>&1000
}&
begin_date=`date-d"+1day$begin_date"+"%Y-%m-%d"`
done
wait
echo"done!!!!!!!!!!"
第6~22行:比如:sh loop_kpi_report.sh 2015-01-01 2015-12-01:
$1表示腳本入參的第一個參數,等於2015-01-01
$2表示腳本入參的第二個參數,等於2015-12-01
$#表示腳本入參的個數,等於2
第13行用於比較傳入的兩個日期的大小,>是轉義
第26行:表示在腳本運行過程中,如果接收到Ctrl+C中斷命令,則關閉文件描述符1000的讀寫,並正常退出
exec 1000>&-;表示關閉文件描述符1000的寫
exec 1000<&-;表示關閉文件描述符1000的讀
trap是捕獲中斷命令
第27~29行:
第27行,創建一個管道文件
第28行,將文件描述符1000與FIFO進行綁定,<讀的綁定,>寫的綁定,<>則標識對文件描述符1000的所有操作等同於對管道文件$tempfifo的操作
第29行,可能會有這樣的疑問:為什麼不直接使用管道文件呢?事實上這並非多此一舉,管道的一個重要特性,就是讀寫必須同時存在,缺失某一個操作,另一個操作就是滯留,而第28行的綁定文件描述符(讀、寫綁定)正好解決了這個問題
第31~34行:對文件描述符1000進行寫入操作。通過循環寫入8個空行,這個8就是我們要定義的後台並發的線程數。為什麼是寫空行而不是寫其它字元?因為管道文件的讀取,是以行為單位的
第37~42行:
第37行,read -u1000的作用就是讀取管道中的一行,在這里就是讀取一個空行;每次讀取管道就會減少一個空行
第39~41行,注意到第42行結尾的&嗎?它表示進程放到linux後台中執行
第41行,執行完後台任務之後,往文件描述符1000中寫入一個空行。這是關鍵所在了,由於read -u1000每次操作,都會導致管道減少一個空行,當linux後台放入了8個任務之後,由於文件描述符1000沒有可讀取的空行,將導致read -u1000一直處於等待。
D. 腳本分幾種,用途都是什麼
腳本語言有很多種,比如VBScript / JavaScript等,完成的功能也有很多。至於怎麼寫腳本,每個腳本都有自己的語言規范,按照語言規范來寫吧,一般腳本都是純文本格式,所以使用系統自帶的筆記本軟體就可以完成這項工作。
E. 什麼是游戲腳本
游戲腳本的意思,就是一個模擬滑鼠、鍵盤的程序,修改需要模擬器。
比如玩家要按一下A鍵, 移動滑鼠點擊一下。這個動作,用腳本可以直接幫玩家執行,省了手動操作。但使用游戲腳本在游戲中是作弊行為,會嚴重影響其他玩家的體驗,因此需要嚴厲抵制。
游戲腳本原理
一個游戲的任務,需要在不同的手機屏幕上進行一系列點擊,滑動,甚至輸入文本,發送語音等動作後才能完成,而這一切操作其實就是手機中會記錄這些動作的文件,文件存儲的是一個又一個的信號量。
這些信號然後根據不同廠商的設定反饋給上層,而上層會根據反饋的信息轉換成統一識別的事件,事件最後響應給應用,並對信息進行相應的處理,最後呈現給用戶並實現它,這一些列的動作都是可以通過一些現有的工具或者說解決方案來幫實現自動游戲的功能。