Ⅰ 編制了bat一個腳本,手動運行可使用,但是任務計劃中設置任務後無法運行。詳見問題補充。
添加計劃任務是要用絕對路徑,路徑有空格要用雙引號括起來
Ⅱ 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一直處於等待。
Ⅲ 如何控制Linux下多個Shell腳本串列執行
當你在一個類似批處理的腳本里啟動多個shell腳本的時候,可能沒有意識到shell背後的調度器會將這些腳本在多個CPU上並行執行。當同時執行的腳本訪問某些共享資源(通常是文件)時,可能造成執行的結果錯誤,而且經常讓你意識不到。
不同於低級語言中提供同步等機制,shell提供的邏輯執行的機制可以用於串列化執行,例如:
1.sh
&&
2.sh
&&
[...]
不過這種方法的一個問題是如果其中有一個環節返回錯誤,整個流程就不能進行下去。不過一般這一點不是問題,甚至這樣就是我們期望的。
剩下的問題:
Ⅳ 按鍵精靈的運行機制
腳本為什麼會運行,又是怎樣運行的
通俗來講, 就是模擬手動按鍵時間並復制。
很多人說按鍵精靈做不到100%命中,這個是正確的。
首先 排除游戲的因素,因為有些球就算完美,也不一定進,這個就是投籃失敗。
那剩下的就是網路因素了。
拿比爾沃克的投籃出手做例子在無延遲的訓練場,比爾沃克的投籃出手是5XX毫秒,當然,如果你錄制時按照這個打正式比賽的話 ,永遠都是出手較早。
因為正式比賽時,出手需要加上3延遲, 即網路延遲、鍵盤延遲和伺服器延遲。
也就是說,這個點,不是固定的。
如何讓這個點固定? 按鍵精靈已經可以做到,自動採集三延遲並補全也就是說。
最後說說這屬性能力裝
這個不可否認,運行商開發游戲是要賺錢,不賺錢他出啥游戲,騰訊又不是紅十字會。
如何選擇正確的加屬性方式?
你的人物屬性除以2 在10點晉級的時候,選擇是最正確的。
比如,你籃板156 除2 ,78 這是增加4點屬性到160 等同單機80的屬性,這樣的收益率是可以接受的。
Ⅳ 關於linux的可執行程序問題,程序自身的內部命令執行機制是怎樣的,可以寫個腳本讓它自動執行內部命令嗎
自己在你的BOOTLOADER裡面配置,配置那些自啟動的參數包含相應的命令
Ⅵ Linux中用cron計劃定期執行腳本
1、date可以顯示年月日時分秒,舉個例子
today=`date +%Y%m%d%H%M%S`
echo ${today}
2、date +%d可以取日期
date +%d再-d tomorrow是想看第二天的日期。
3、你說的例子是如果月末最後一天就執行,因為月末數字不好判斷,所以用明天是1號判斷,當天肯定是月末。
Ⅶ webpack執行機制流程是怎麼樣的
幾乎所有業務的開發構建都會用到 webpack 。的確,作為模塊載入和打包神器,只需配置幾個文件,載入各種 loader 就可以享受無痛流程化開發。但對於 webpack 這樣一個復雜度較高的插件集合,它的整體流程及思想對我們來說還是很透明的。那麼接下來我會帶你了解 webpack 這樣一個構建黑盒,首先來談談它的流程。 准備工作 1. webstorm 中配置 webpack-webstorm-debugger-script 在開始了解之前,必須要能對 webpack 整個流程進行 debug ,配置過程比較簡單。 先將 webpack-webstorm-debugger-script 中的軟體外包企業公司 置於 webpack.config.js 的同一目錄下,搭建好你的腳手架後就可以直接 Debug 這個 webstorm-debugger.js 文件了。 2. webpack.config.js 配置 估計大家對 webpack.config.js 的配置也嘗試過不少次了,這里就大致對這個配置文件進行個分析。 var path = require('path'); var node_moles = path.resolve(__dirname, 'node_moles'); var pathToReact = path.resolve(node_moles, 'react/dist/react.min.js'); mole.exports = { // 入口文件,是模塊構建的起點,同時每一個入口文件對應最後生成的一個 chunk。 entry: { bundle: [ 'webpack/hot/dev-server', 'webpack-dev-server/client?', path.resolve(__dirname, 'app/app.js') ], }, // 文件路徑指向(可加快打包過程)。 resolve: { alias: { 'react': pathToReact } }, // 生成文件,是模塊構建的終點,包括輸出文件與輸出路徑。 output: { path: path.resolve(__dirname, 'build'), filename: '[name].js', }, // 這里配置了處理各模塊的 loader ,包括 css 預處理 loader ,es6 編譯 loader,圖片處理 loader。 mole: { loaders: [ { test: /\.js$/, loader: 'babel', query: { presets: ['es2015', 'react'] } } ], noParse: [pathToReact] }, // webpack 各插件對象,在 webpack 的事件流中執行對應的方法。 plugins: [ new webpack.HotMoleReplacementPlugin(); ] }; 除此之外再大致介紹下 webpack 的一些核心概念: loader : 能轉換各類資源,並處理成對應模塊的載入器。loader 間可以串列使用。 chunk : code splitting後的產物,也就是按需載入的分塊,裝載了不同的mole。 對於mole和chunk的關系可以參照webpack官方的這張圖: plugin : webpack 的插件實體,這里以 UglifyJsPlugin 為例。 function UglifyJsPlugin(options) { this.options = options; } mole.exports = UglifyJsPlugin; UglifyJsPlugin.prototype.apply = function(compiler) { compiler.plugin("compilation", function(compilation) { compilation.plugin("build-mole", function(mole) { }); compilation.plugin("optimize-chunk-assets", function(chunks, callback) { // Uglify 邏輯 }); compilation.plugin("normal-mole-loader", function(context) { }); }); }; 在 webpack 中你經常可以看到 compilation.plugin('xxx', callback) ,你可以把它當作是一個事件的綁定,這些事件在打包時由 webpack 來觸發。 3. 流程總覽 在具體流程學習前,可以先通過這幅 webpack整體流程圖 了解一下大致流程(建議保存下來查看)。 shell 與 config 解析 每次在命令行輸入 webpack 後,操作系統都會去調用 ./node_moles/.bin/webpack 這個 shell 腳本。這個腳本會去調用./node_moles/webpack/bin/webpack.js 並追加輸入的參數,如 -p , -w 。(圖中 webpack.js 是 webpack 的啟動文件,而 $@ 是後綴參數) 在 webpack.js 這個文件中 webpack 通過 optimist 將用戶配置的 webpack.config.js 和 shell 腳本傳過來的參數整合成 options 對象傳到了下一個流程的控制對象中。 1. optimist 和 commander 一樣,optimist 實現了 node 命令行的解析,其 API 調用非常方便。 var optimist = require("optimist"); optimist .boolean("json").alias("json", "j").describe("json") .boolean("colors").alias("colors", "c").describe("colors") .boolean("watch").alias("watch", "w").describe("watch") ... 獲取到後綴參數後,optimist 分析參數並以鍵值對的形式把參數對象保存在 optimist.argv 中,來看看 argv 究竟有什麼? // webpack --hot -w { hot: true, profile: false, watch: true, ... } 2. config 合並與插件載入 在載入插件之前,webpack 將 webpack.config.js 中的各個配置項拷貝到 options 對象中,並載入用戶配置在 webpack.config.js 的 plugins 。接著 optimist.argv 會被傳入到 ./node_moles/webpack/bin/convert-argv.js 中,通過判斷 argv 中參數的值決定是否去載入對應插件。(至於 webpack 插件運行機制,在之後的運行機制篇會提到) ifBooleanArg("hot", function() { ensureArray(options, "plugins"); var HotMoleReplacementPlugin = require("../lib/HotMoleReplacementPlugin"); options.plugins.push(new HotMoleReplacementPlugin()); }); ... return options; options 作為最後返回結果,包含了之後構建階段所需的重要信息。 { entry: {},//入口配置 output: {}, //輸出配置 plugins: [], //插件集合(配置文件 + shell指令) mole: { loaders: [ [Object] ] }, //模塊配置 context: //工程路徑 ... } 這和 webpack.config.js 的配置非常相似,只是多了一些經 shell 傳入的插件對象。插件對象一初始化完畢, options 也就傳入到了下個流程中。 var webpack = require("../lib/webpack.js"); var compiler = webpack(options); 編譯與構建流程 在載入配置文件和 shell 後綴參數申明的插件,並傳入構建信息 options 對象後,開始整個 webpack 打包最漫長的一步。而這個時候,真正的 webpack 對象才剛被初始化,具體的初始化邏輯在 lib/webpack.js 中,如下: function webpack(options) { var compiler = new Compiler(); ...// 檢查options,若watch欄位為true,則開啟watch線程 return compiler; } ... webpack 的實際入口是 Compiler 中的 run 方法,run 一旦執行後,就開始了編譯和構建流程 ,其中有幾個比較關鍵的 webpack 事件節點。 compile 開始編譯 make 從入口點分析模塊及其依賴的模塊,創建這些模塊對象 build-mole 構建模塊 after-compile 完成構建 seal 封裝構建結果 emit 把各個chunk輸出到結果文件 after-emit 完成輸出 1. 核心對象 Compilation compiler.run 後首先會觸發 compile ,這一步會構建出 Compilation 對象: compilation類圖 這個對象有兩個作用,一是負責組織整個打包過程,包含了每個構建環節及輸出環節所對應的方法,可以從圖中看到比較關鍵的步驟,如 addEntry() , _addMoleChain() , buildMole() , seal() , createChunkAssets() (在每一個節點都會觸發 webpack 事件去調用各插件)。二是該對象內部存放著所有 mole ,chunk,生成的 asset 以及用來生成最後打包文件的 template 的信息。 2. 編譯與構建主流程 在創建 mole 之前,Compiler 會觸發 make,並調用 Compilation.addEntry 方法,通過 options 對象的 entry 欄位找到我們的入口js文件。之後,在 addEntry 中調用私有方法 _addMoleChain ,這個方法主要做了兩件事情。一是根據模塊的類型獲取對應的模塊工廠並創建模塊,二是構建模塊。 而構建模塊作為最耗時的一步,又可細化為三步: 調用各 loader 處理模塊之間的依賴 webpack 提供的一個很大的便利就是能將所有資源都整合成模塊,不僅僅是 js 文件。所以需要一些 loader ,比如 url-loader ,jsx-loader , css-loader 等等來讓我們可以直接在源文件中引用各類資源。webpack 調用 doBuild() ,對每一個 require() 用對應的 loader 進行加工,最後生成一個 js mole。 Compilation.prototype._addMoleChain = function process(context, dependency, onMole, callback) { var start = this.profile && +new Date(); ... // 根據模塊的類型獲取對應的模塊工廠並創建模塊 var moleFactory = this.dependencyFactories.get(dependency.constructor); ... moleFactory.create(context, dependency, function(err, mole) { var result = this.addMole(mole); ... this.buildMole(mole, function(err) { ... // 構建模塊,添加依賴模塊 }.bind(this)); }.bind(this)); }; 調用 acorn 解析經 loader 處理後的源文件生成抽象語法樹 AST Parser.prototype.parse = function parse(source, initialState) { var ast; if(!ast) { // acorn以es6的語法進行解析 ast = acorn.parse(source, { ranges: true, locations: true, ecmaVersion: 6, sourceType: "mole" }); } ... }; 遍歷 AST,構建該模塊所依賴的模塊 對於當前模塊,或許存在著多個依賴模塊。當前模塊會開辟一個依賴模塊的數組,在遍歷 AST 時,將 require() 中的模塊通過addDependency() 添加到數組中。當前模塊構建完成後,webpack 調用 processMoleDependencies 開始遞歸處理依賴的 mole,接著就會重復之前的構建步驟。 Compilation.prototype.addMoleDependencies = function(mole, dependencies, l, cacheGroup, recursive, callback) { // 根據依賴數組(dependencies)創建依賴模塊對象 var factories = []; for(var i = 0; i < dependencies.length; i++) { var factory = _this.dependencyFactories.get(dependencies[i][0].constructor); factories[i] = [factory, dependencies[i]]; } ... // 與當前模塊構建步驟相同 } 3. 構建細節 mole 是 webpack 構建的核心實體,也是所有 mole的 父類,它有幾種不同子類:NormalMole , MultiMole ,ContextMole , DelegatedMole 等。但這些核心實體都是在構建中都會去調用對應方法,也就是 build() 。來看看其中具體做了什麼: // 初始化mole信息,如context,id,chunks,dependencies等。 NormalMole.prototype.build = function build(options, compilation, resolver, fs, callback) { this.buildTimestamp = new Date().getTime(); // 構建計時 this.built = true; return this.doBuild(options, compilation, resolver, fs, function(err) { // 指定模塊引用,不經acorn解析 if(options.mole && options.mole.noParse) { if(Array.isArray(options.mole.noParse)) { if(options.mole.noParse.some(function(regExp) { return typeof regExp === "string" ? this.request.indexOf(regExp) === 0 : regExp.test(this.request); }, this)) return callback(); } else if(typeof options.mole.noParse === "string" ? this.request.indexOf(options.mole.noParse) === 0 : options.mole.noParse.test(this.request)) { return callback(); } } // 由acorn解析生成ast try { this.parser.parse(this._source.source(), { current: this, mole: this, compilation: compilation, options: options }); } catch(e) { var source = this._source.source(); this._source = null; return callback(new MoleParseError(this, source, e)); } return callback(); }.bind(this)); }; 對於每一個 mole ,它都會有這樣一個構建方法。當然,它還包括了從構建到輸出的一系列的有關 mole 生命周期的函數
Ⅷ sh腳本如何自動執行java程序,並且該腳本如何被定期調用
各位好我有一個問題,是這樣: 環境:有一套管理系統(包括聯機和批量),該管理系統白天運行聯機系統,晚上運行批量系統。 目的:聯機系統運行到晚上,會停掉,這時候通過在unix下的sh腳本調用並且啟動批量系統。 sh腳本可以調用java程序,通過java程序就可以啟動了批量系統。 andilyliao 寫道最簡單的方法 你可以用java寫一個job 然後每天晚上執行sh mginobili 寫道可以在腳本中 實現一個定時功能啊 比如每隔半小時 檢查一次當前的時間 如果到了晚上 就停止聯機系統,運行批量系統 當然前提是 這個sh腳本要一直保持運行狀態 並且其錯誤處理機制要完善問題補充:哦。你的意思是不是這樣啊, 這個sh腳本作為一個定時器,定時調用啟動聯機系統或者批量系統的程序。 通過while(1)這樣一個循環,一直運行不中斷,然後sleep一定時間,就調用聯機的啟動程序,再過一定時間,關閉聯機啟動批量系統。
Ⅸ 腳本超時問題
超過了腳本運行的最長時間。可以為 Server.ScriptTimeOut 屬性指定新值或更改 IIS 管理工具中的相應值來更改此限制。
機制使用戶得以 misbehaved 腳本運行到一個無限循環, 否則執行緩慢或停止。
Internet Explorer 3.02, 中運行 Windows 95 計算機上才會顯示此消息框。 3.02 版本瀏覽器是專門希望看到如果腳本線程已 pumped 任何窗口消息在 " 最後五秒。 沒有要用於 Internet Explorer 3.02 覆蓋此超沒有辦法。 If you are using an ActiveX control with long blocking operations, that ActiveX control should either employ an event mechanism and return control to the caller or call PeekMessage every five seconds to reset the timeout.
存為 " 是 5.0 和 6.0, Internet Explorer 4.0, 超時是不再固定值基於 Windows 消息。 InternetExplorer 現在跟蹤與腳本引擎執行腳本語句為當前網頁總次數, 向上超時對話框該值命中閾值量時引發。
警告 如果注冊表編輯器使用不當, 您可能導致嚴重問題, 可能要求您重新安裝操作系統。 Microsoft 無法保證您能解決因注冊表編輯器使用不當而導致問題。 需要您自擔風險使用注冊表編輯器。
請來更改此超值在 Internet Explorer 4.0, 5.0 或 6.0 版本, 按照下列步驟操作: 1. 使用注冊表編輯器 (如 Regedt 32 .exe, 打開該項:
HKEY_CURRENT_USER\Software\Microsoft\InternetExplorer\Styles
如果 注意 Styles 沒有該項, 創建新密鑰被調用 Styles.
2. 創建新 DWORD 值稱為 " MaxScriptStatements " 此項下並將該值設置為所需的腳本語句數。
默認鍵不存在。 如果尚未添加鍵, Internet Explorer 4 默認為 5,000,000 語句作為觸發器用於 $ 超時對話框執行。
Because the Internet Explorer 4.0, 5.0, and 6.0 timeout is based on the number of script statements executed, the timeout dialog box will not display ring ActiveX control or database-access delays. 腳本中無限循環將仍能檢測
Ⅹ 如何實現linux shell腳本的並發處理機制
我一般是 放到後台運行 { }& 後面跟個wait