很多人有很多的壞習(xí)慣,如:看電視,打麻將,喝酒,泡舞廳,他們也知道這樣的習(xí)慣不好,但是他們?yōu)槭裁床辉敢飧淖兡兀恳驗(yàn)楹芏嗳藢幵溉淌苣切┎缓玫纳罘绞剑膊辉敢馊淌芨淖儙淼耐纯?/div>
你在生活中喜歡那些人呢?是那些整天愁眉苦臉,整天抱怨這個(gè)抱怨哪個(gè)的人,還是喜歡那些整天開開心心的人。如果你在生活中是那些抱怨的,消極的人的話,你一定要改變你性格中的缺陷。如果你不改變的話,你是很難適應(yīng)這個(gè)社會(huì)的。你也是很難和別人合作的。
生活當(dāng)中你要知道,你怎樣對(duì)待生活,生活也會(huì)怎樣對(duì)待你,你怎樣對(duì)待別人,別人也會(huì)怎樣對(duì)待你。所以你不要消極,抱怨。你要積極,永遠(yuǎn)的積極下去,就是那句話:成功者永不抱怨,抱怨者永不成功
如果你想成功,一定要學(xué)會(huì)管理好這五個(gè)因素,為什么把情緒放在第一位呢?把健康放在第二位呢?是因?yàn)槿绻阍購(gòu)?qiáng)的身體,如果你情緒不好,就會(huì)影響到你的身體,現(xiàn)在一個(gè)人要成功20%靠的是智商,80%靠的是情商,所以你要控制好你的情緒,情緒對(duì)人的影響是非常大的。人與人之間,不要為了一點(diǎn)點(diǎn)小事情,就暴跳如雷,這樣是不好的。
你就會(huì)成為一個(gè)受社會(huì)大眾歡迎的人。如果你想讓你的伙伴更加的優(yōu)秀,很簡(jiǎn)單,永遠(yuǎn)的激勵(lì)和贊美他們。
即使他們的確有毛病,那應(yīng)該怎么辦呢?這時(shí)是不是應(yīng)該給他們建議,在生活中你會(huì)發(fā)現(xiàn)有這樣一個(gè)現(xiàn)象,有人給別人建議的時(shí)候,別人能夠接受,但是有建議的時(shí)候別人就會(huì)生氣。其實(shí)建議的方式是最重要的,就是"三明治"贊美,建議,再贊美!
如果你帶有很強(qiáng)的目的性去贊美,那就是拍馬屁。當(dāng)你贊美別人時(shí)候,你要大聲的說出來,當(dāng)你想批評(píng)別人的時(shí)候,一定要咬住你的舌頭!
其實(shí)人和動(dòng)物之間有很多的相似之處,動(dòng)物的自我保護(hù)意識(shí)比人更強(qiáng)(嬰兒與小豬)但是,人和動(dòng)物最大的區(qū)別在于,人會(huì)學(xué)習(xí),人會(huì)思考。人是要不斷學(xué)習(xí)的,你千萬(wàn)不要把你的天賦潛能給埋沒了,一定要學(xué)習(xí),一定要有一個(gè)空杯的心態(tài)。我們象誰(shuí)去學(xué)習(xí)呢?就是直接向成功人士學(xué)習(xí)!
你要永遠(yuǎn)學(xué)習(xí)積極正面的東西,不看,不聽那些消極,負(fù)面的東西。一旦你吸收了那些有毒的思想,它會(huì)腐蝕你的心靈和人生 的。在這個(gè)知識(shí)經(jīng)濟(jì)的時(shí)代里,學(xué)習(xí)是你通向未來的唯一護(hù)照。在這樣一個(gè)速度,變化,危機(jī)的時(shí)代,你只有不斷的學(xué)習(xí)你才不會(huì)被這個(gè)時(shí)代所拋棄,一定要有學(xué)習(xí),歸零的心態(tài)。去看每一個(gè)人的優(yōu)點(diǎn),"三人行,必有我?guī)熞玻ⅲ?/div>
人不成熟的第五個(gè)特征:做事情不靠信念,靠人言。
我們說相信是起點(diǎn),堅(jiān)持是終點(diǎn)。很多人做事不靠信念,喜歡聽別人怎么說。對(duì)自己所做的事業(yè),沒有100%的信心,相信和信念是兩個(gè)不同的概念,相信是看得見的,信念是看不見的。
信念是人類的一種態(tài)度,但是很多的人他們做事,不靠信念的,而是要聽別人怎么說,你要登上山峰,要問那些爬到山頂?shù)娜耍f(wàn)不能問沒有爬過山的人。
這里不是說別人的建議不要去聽,你可以去參考,但是你要記住,你來做這個(gè)生意是為了實(shí)現(xiàn)你的夢(mèng)想,實(shí)現(xiàn)你自己的價(jià)值。其他的人是不會(huì)關(guān)心你的夢(mèng)想的,只有你自己關(guān)心你自己的夢(mèng)想,只有你自己關(guān)心你自己能否真正的成功。這才是最重要的!
只要你的選擇是正確的,永遠(yuǎn)不要在乎別人怎么說,以上的人不成熟的五個(gè)特征,你們自己去對(duì)照,那一個(gè)特征是你有的,你一定要在最短的時(shí)間里改正,只要你相信你自己能夠戰(zhàn)勝自己的不成熟,你就會(huì)逐漸的成長(zhǎng),成熟起來,你就會(huì)得到你想要的那種生活。你就會(huì)實(shí)現(xiàn)你時(shí)間自由、財(cái)務(wù)自由、精神自由的人生夢(mèng)想!
設(shè)置了 scanPeriod 之后,過了好長(zhǎng)時(shí)間,都不生效,后來 debug 代碼。發(fā)現(xiàn)了下面這段。
private volatile long mask = 0xF;
@Override
public FilterReply decide(Marker marker, Logger logger, Level level,
String format, Object[] params, Throwable t) {
if (!isStarted()) {
return FilterReply.NEUTRAL;
}
// for performance reasons, skip change detection (MASK-1) times out of MASK.
// Only once every MASK calls is change detection code executed
// Note that MASK is a variable itself.
if (((invocationCounter++) & mask) != mask) {
return FilterReply.NEUTRAL;
}
long now = System.currentTimeMillis();
synchronized (configurationWatchList) {
updateMaskIfNecessary(now);
if (changeDetected(now)) {
// Even though reconfiguration involves resetting the loggerContext,
// which clears the list of turbo filters including this instance, it is
// still possible for this instance to be subsequently invoked by another
// thread if it was already executing when the context was reset.
disableSubsequentReconfiguration();
detachReconfigurationToNewThread();
}
}
return FilterReply.NEUTRAL;
}
這行 if (((invocationCounter++) & mask) != mask) {
mask = 0xf,其實(shí)要每循環(huán) 0xf 次,也就是 15 次,才會(huì)去 check 一次是否要更新,也就是說,不管過了多久,如果沒到這 15 次,也不會(huì)去檢查是否更新配置。
也就是說,我多打幾次 log,配置文件就生效了。
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
spring security(下簡(jiǎn)寫為 ss)控制的安全主要有兩方面,Web 和 Method Call,這兩個(gè)方面的權(quán)限控制有比較多的相通的設(shè)計(jì),也有一些特別的功能。比如 Method Call 可以做 After Invocation 控制,而 Web 可以做 Ip 地址控制。
這里面有兩個(gè)最基本的概念:authentication manager 和 access decision manager,前者控制認(rèn)證,后都控制鑒權(quán)。
1. 在 ss 的認(rèn)證系統(tǒng)中,默認(rèn)的實(shí)現(xiàn)幫助我們提供了三個(gè)概念,用戶(user),角色(authority,一般存 role)和組(group),三者的關(guān)系是,組、角色與用戶都是多對(duì)多關(guān)系,組和角色間沒關(guān)系,默認(rèn)是不啟用組的。后續(xù),在 Acl 權(quán)限管理中,可以看到角色之間,是可以有包含(樹形?)關(guān)系的。
2. 在 ss 的鑒權(quán)系統(tǒng)中,明顯會(huì)比認(rèn)證復(fù)雜得多。有 AccessDecisionManager, AccessDecisionVoter(前置), AfterInvocationProvider(后置), RoleHierarchy, SidRetrievalStrategy, LookupStrategy, PermissionGrantingStrategy, SecurityExpressionHandler, AclService, MutableAclService, AclCache 概念過多了,要一個(gè)一個(gè)解釋
a) 中心是 AccessDecisionManager,主要負(fù)責(zé) AccessDecisionVoter 的管理,默認(rèn)提供了3種實(shí)現(xiàn):1. AffirmativeBased 如果有任何一個(gè)投票器允許訪問,請(qǐng)求將被立刻允許,而不管之前可能有的拒絕決定。2. ConsensusBased 多數(shù)票(允許或拒絕)決定了結(jié)果,平局的投票 和空票(全是棄權(quán)的)的結(jié)果是可配置的。3. UnanimousBased 所有的投票器必須全是允許的,否則訪問將 被拒絕。
AccessDecisionManager 在用于 Web 和 Method Call 兩種情況下,可能是不一致的,因?yàn)楣δ芤膊灰恢隆?br />
b) Method Call 除了使用 AccessDecisionManager 進(jìn)行權(quán)限判斷外,還可以增加 AfterInvocationProvider 來進(jìn)行出口數(shù)據(jù)的判斷,默認(rèn)提供了 3 種。
1) PostInvocationAdviceProvider: 需要提供一個(gè) PostInvocationAuthorizationAdvice,默認(rèn)實(shí)現(xiàn)只有一個(gè),就是 ExpressionBasedPostInvocationAdvice,可以通過 spel 來進(jìn)行權(quán)限判斷。注意 ExpressionBasedPostInvocationAdvice 中需要提供一個(gè) MethodSecurityExpressionHandler,能夠創(chuàng)建出一個(gè) MethodSecurityExpressionOperations,放到 spel context 中,供 spel function 調(diào)用,這樣的方式,在后續(xù)很常見。
2) AclEntryAfterInvocationProvider 和 AclEntryAfterInvocationCollectionFilteringProvider : 這兩種都差不多,主要依賴 AclService, ObjectIdentityRetrievalStrategy, SidRetrievalStrategy 來配合,檢查返回值的權(quán)限。Collection 版本的,可以把無(wú)權(quán)限的數(shù)據(jù)去掉,只留下有權(quán)限的數(shù)據(jù)。
c) RoleHierarchy 提供了角色之間的關(guān)系,提供了兩個(gè)實(shí)現(xiàn),一個(gè)是沒關(guān)系的,直接把 user 的 role 返回,另外一個(gè)是有繼承關(guān)系的。繼承關(guān)系實(shí)現(xiàn)挺有意思的,能夠處理多級(jí)的 include 關(guān)系,比較好用。
RoleHierarchy 的使用比較復(fù)雜,會(huì)被 AccessDecisionVoter, SidRetrievalStrategy, SecurityExpressionHandler 用到,SecurityExpressionHandler 又會(huì)被 AccessDecisionVoter 用到,所以還是有點(diǎn)兒混亂。
具體的說 SecurityExpressionHandler 會(huì)用到 PermissionEvaluator 和 RoleHierarchy,PermissionEvaluator 的一個(gè)實(shí)現(xiàn) AclPermissionEvaluator 會(huì)用到 SidRetrievalStrategy。
d) SidRetrievalStrategy 和 RoleHierarchy 的功能比較接近,比 RoleHierarchy 高一個(gè)抽象層次,功能上也有所區(qū)別,是從一個(gè) authentication 拿到所有相關(guān)的 Sid(包括 Role(GrantedAuthoritySid) 和 User(PrincipalSid)),而 RoleHierarchy 只包括了 Role(GrantedAuthoritySid)的繼承關(guān)系。
e) LookupStrategy 通過 ObjectIdentity 和 Sid 把相關(guān)的 Acl 查詢出來。可以在 LookupStrategy 擴(kuò)展 Acl 和 Ace 的功能,比如在 Ace 上面加上時(shí)間的條件限制,就需要自己定義 LookupStrategy,把時(shí)間條件從數(shù)據(jù)庫(kù)查詢出來,并放到自定義的 Ace 當(dāng)中。
但這件事情非常麻煩,因?yàn)槟J(rèn)實(shí)現(xiàn)的 BasicLookupStrategy 是個(gè) Final 的類,所以只能自己直接實(shí)現(xiàn)接口,無(wú)法使用現(xiàn)有的功能。
LookupStrategy 會(huì)生成 Acl,而最終的權(quán)限驗(yàn)證是由 Acl 完成的,如果想驗(yàn)證帶時(shí)間條件的 Ace,需要給 Acl 設(shè)置自定義的帶有檢查時(shí)間功能的 PermissionGrantingStrategy,實(shí)際上,這個(gè) PermissionGrantingStrategy 會(huì)首先設(shè)置給 LookupStrategy,LookupStrategy 在創(chuàng)建 Acl 的時(shí)候,再放到 Acl 中去。
f) SecurityExpressionHandler 能夠執(zhí)行 spel,得到是否可以訪問的結(jié)果,它的子類都是繼承自 AbstractSecurityExpressionHandler 的,有一個(gè)非常重要的方法是 SecurityExpressionOperations createSecurityExpressionRoot(Authentication authentication, T invocation),創(chuàng)建一個(gè) SecurityExpressionOperations 放到 EvaluationContext 中去,提供 spel 中執(zhí)行的方法實(shí)現(xiàn)。比如 SecurityExpressionOperations 的一個(gè)抽象實(shí)現(xiàn) SecurityExpressionRoot 中,就包含了大量的權(quán)限驗(yàn)證方法,如 hasRole, hasPermission 等常用的功能。
g) AclService, MutableAclService, AclCache 概念比較簡(jiǎn)單,AclService 是通過 LookupStrategy 查詢 Acl,自已可以查詢 ObjectIdentity 的父子關(guān)聯(lián)關(guān)系,MutableAclService 提供了修改的能力,AclCache 為 AclService 提供緩存,默認(rèn)的實(shí)現(xiàn)了一個(gè) EhCacheBasedAclCache。
3. ss 的鑒權(quán)模型 Sid, ObjectIdentity, Acl, Ace, Permission
a) Sid: 是中心,所有的授權(quán)會(huì)關(guān)聯(lián)在 Sid 上面,Sid 和之前的 Role Base Permission 會(huì)有些相同的地方,但也明顯不同,Sid 默認(rèn)實(shí)現(xiàn)情況下,分為 GrantedAuthoritySid 和 PrincipalSid,其實(shí)就是 Role 和 User,通過 SidRetrievalStrategy 拿到一個(gè) Authentication 的 Sid。
b) ObjectIdentity: 可以理解成 Resource,就是可訪問的目標(biāo)資源,有 id 和 type 兩個(gè)字段,默認(rèn)實(shí)現(xiàn)的 ObjectIdentityImpl 會(huì)直接調(diào)用目標(biāo) domainObject 的 getClass 和 getId 方法拿到兩個(gè)參數(shù)。在 PermissionEvaluator, AfterInvocationProvider 中,會(huì)用到 ObjectIdentityRetrievalStrategy 和 ObjectIdentityGenerator,ObjectIdentityRetrievalStrategy 會(huì)根據(jù) domainObject 拿到 ObjectIdentity,然后使用 Acl 進(jìn)行鑒權(quán),ObjectIdentityGenerator 會(huì)在系統(tǒng)提供的不是 domainObject,而是 type, id 的時(shí)候,拿到 ObjectIdentity,然后進(jìn)行 Acl 鑒權(quán),這兩個(gè)接口有一個(gè)共同的實(shí)現(xiàn) ObjectIdentityRetrievalStrategyImpl,如果需要在 ObjectIdentity 進(jìn)行新的抽象,需要用新的實(shí)現(xiàn),到得不同的 ObjectIdentity,比如將業(yè)務(wù)對(duì)象分類鑒權(quán)這樣的需求。
c) Acl, 每個(gè) ObjectIdentity 最多對(duì)應(yīng)一條 Acl,Acl 中包含了很多,包括 parental,說明 Acl 是有繼承關(guān)系的?其實(shí)不是,呵呵,是 ObjectIdentity 有繼承關(guān)系而已。有一個(gè) ObjectIdentity,有很多 Sid,還有一個(gè)叫做 Owner 的 Sid,有從 LookupStrategy 傳過來的 PermissionGrantingStrategy,進(jìn)行實(shí)際的鑒權(quán),還有 AclAuthorizationStrategy 檢查有沒有權(quán)限進(jìn)行 Acl security check。實(shí)現(xiàn)時(shí)間條件檢查,就擴(kuò)展 PermissionGrantingStrategy。
為什么沒有 RoleHierarchy 或是 SidRetrievalStrategy 存在呢?是因?yàn)檎{(diào)用 Acl 進(jìn)行權(quán)限檢查之前,已經(jīng)把相關(guān)的 Sid 得到了,再給 Acl 的。
d) Ace, Permission: Ace 存儲(chǔ) Sid, Permission,提供給 Acl 鑒權(quán)用。增加時(shí)間條件的話,最基本的,就是要在 Ace 中,增加時(shí)間條件字段。Permission 是用二進(jìn)制存儲(chǔ)的,但默認(rèn)實(shí)現(xiàn)的數(shù)據(jù)庫(kù)存儲(chǔ)并不是,是一個(gè)一條,存在數(shù)據(jù)庫(kù)里面的。
好吧,概念還是非常多的,不過鑒于權(quán)限控制本身就是個(gè)復(fù)雜的話題,ss 這些設(shè)計(jì)的我覺得已經(jīng)非常好,也基本夠用了。
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
Security.setProperty("ssl.SocketFactory.provider", "com.datayes.cloud.util.TrustAllSSLSocketFactory");
package com.datayes.cloud.util;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
public class TrustAllSSLSocketFactory extends SSLSocketFactory {
SSLContext sslContext = SSLContext.getInstance("TLS");
public TrustAllSSLSocketFactory() throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {
TrustManager tm = new X509TrustManager() {
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
};
sslContext.init(null, new TrustManager[]{tm}, null);
}
@Override
public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException {
return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);
}
@Override
public Socket createSocket(String host, int port) throws IOException {
return sslContext.getSocketFactory().createSocket(host, port);
}
@Override
public Socket createSocket(String host, int port, InetAddress localHost, int localPort) throws IOException {
return sslContext.getSocketFactory().createSocket(host, port, localHost, localPort);
}
@Override
public Socket createSocket(InetAddress host, int port) throws IOException {
return sslContext.getSocketFactory().createSocket(host, port);
}
@Override
public Socket createSocket(InetAddress address, int port, InetAddress localAddress, int localPort) throws IOException {
return sslContext.getSocketFactory().createSocket(address, port, localAddress, localPort);
}
@Override
public Socket createSocket() throws IOException {
return sslContext.getSocketFactory().createSocket();
}
@Override
public String[] getDefaultCipherSuites() {
return new String[0];
}
@Override
public String[] getSupportedCipherSuites() {
return new String[0];
}
}
主要是遇到的一些問題吧,順便感謝一下幫助了我的人。安裝之前,聽說安裝正式環(huán)境的 OpenStack 挺麻煩的,所以,出發(fā)點(diǎn)就是安裝一個(gè)能測(cè)試使用的 Dev 環(huán)境就可以了,不求全,時(shí)間緊張,能用就行。所以,定位到 devstack(http://devstack.org),一鍵安裝 OpenStack
問題
1. 想用 CentOS 來著,沒原因,習(xí)慣了,后來發(fā)現(xiàn),devstack 默認(rèn)支持 ubuntu,為了簡(jiǎn)單,改用 ubuntu
2. 安裝過程中,需要大量的網(wǎng)絡(luò)下載,網(wǎng)速如果不快,挺急人的。
3. 安裝到 stack.sh 的 191 行,會(huì)報(bào)錯(cuò) [ERROR] ./stack.sh:191 g-api did not start,這個(gè)問題折騰了我好久,最后按照 https://answers.launchpad.net/glance/+question/231020 辦法解決了,非常感謝 Marc PINHEDE (pinhede-marc) ,但在 https://bugs.launchpad.net/devstack/+bug/1119428 里,有人說只要修改 /etc/default/locale LANG="POSIX",就可以了,其實(shí)我兩個(gè)都改了,也不知道是哪個(gè)產(chǎn)生了作用。但,第一種方法,需要安裝到一半,失敗了,才會(huì)有提到的 /opt/stack/glance/glance/notifier/notify_kombu.py 文件,但第二種方法,剛開始就可以嘗試,所以我如果下次安裝的話,會(huì)先把第二種配置修改好,如果安裝失敗了,再使用第一種方法繼續(xù)。
在 compile hadoop-common 的時(shí)候,提示 protobuf 出錯(cuò),查了一下,需要安裝 protobuf(是一個(gè)非 Java 的組件)
先到 homebrew 上找到安裝 homebrew 的方法 ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
然后不能直接 brew install protobuf,因?yàn)闀?huì)安裝 1.5.0,也沒辦法編譯過的,我試了。
需要先 brew versions protobuf,然后 cd `brew --prefix`(我默認(rèn)的是 cd /usr/local),直接招待剛才 brew versions 出來的那個(gè) git clone 方法。
然后再次 brew install protobuf ,就安裝 1.4.1 了,繼續(xù) maven 就沒有問題了。
在 .bash_profile 中增加一行 export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 就可以了。
一直以來,總有人說 IDEA 這個(gè) IDE 要比 Eclipse 好。中間也做過幾次嘗試,均告放棄。原因雖然各種各樣,但歸結(jié)起來,就是沒時(shí)間,畢竟熟悉一個(gè) IDE 是要時(shí)間的,項(xiàng)目中很少會(huì)有這么輕松的時(shí)候,又不愿意過多使用業(yè)余時(shí)間,就這樣放下了。
最近有了一些時(shí)間,又把這東西拾起來看了看。不得不說,有些地方,做得還是很好的,當(dāng)然,也有比 Eclipse 差的地方,我估計(jì)已經(jīng)有無(wú)數(shù)人對(duì)比過了,我也不再比了,focus 在我的關(guān)注點(diǎn)上:“快捷鍵”
IDEA 因?yàn)槭褂玫氖窃?Java 而不是 swt,對(duì)于平臺(tái)集成方面,不如 Eclipse。
比如在 Eclipse 中,可以設(shè)置 Option + B 這樣的快捷鍵,而 IDEA 不行,因?yàn)?Option + B 在 Mac 下是有輸出字符的。
為了解決這個(gè)問題,我到 KeyRemap4MacBook 中,把 Option + B 改成 Option + Left,同理,把 Option + F 改成 Option + Right
這時(shí),在 IDEA 中比較常用的快捷鍵 Command + Option + B 就變成了 Command + Option + Left,成了后退了。
還需要在 KeyRemap4MacBook 中把 Command + Option + B 恢復(fù)成他自己,而且一定要放在 Option + B 前面,否則就沒用了。
最終,我得到了這樣的 private.xml
<?xml version="1.0"?>
<root>
<item>
<name>haha</name>
<identifier>private.haha</identifier>
<autogen>--KeyToKey-- KeyCode::P,VK_CONTROL, KeyCode::CURSOR_UP</autogen>
<autogen>--KeyToKey-- KeyCode::N,VK_CONTROL, KeyCode::CURSOR_DOWN</autogen>
<autogen>__KeyToKey__ KeyCode::F,VK_OPTION, KeyCode::CURSOR_RIGHT,VK_OPTION</autogen>
<autogen>__KeyToKey__ KeyCode::B,VK_OPTION,VK_COMMAND, KeyCode::B,VK_OPTION,VK_COMMAND</autogen>
<autogen>__KeyToKey__ KeyCode::B,VK_OPTION, KeyCode::CURSOR_LEFT,VK_OPTION</autogen>
<autogen>__KeyToKey__ KeyCode::D,VK_OPTION, KeyCode::FORWARD_DELETE,VK_OPTION</autogen>
</item>
</root>
$(window).scroll(function() {
if($(window).scrollTop() + $(window).height() == $(document).height()) {
// load next
}
});
把這個(gè)文件放到 WEB-INF/classes 下面,隨便申請(qǐng)一個(gè)臨時(shí) License 就可以了,會(huì)變成 Enterprice 的,其它信息保留。
今天想在 log 里加上當(dāng)前機(jī)器的 ip,找了一些文檔,logback 支持 MDC(Mapped Diagnostic Contexts),可以很容易的把 ip 放到 log 中。
方法:
1. 先在代碼中加上一行 MDC.put("ip", InetAddress.getLocalHost().getHostAddress())
2. 然后在 logback 的 pattern 中加上 %X{ip} 即可
vi /etc/yum.conf 將exclude=kernel* 去掉
1. 建立 winexe 環(huán)境,build winexe 并不麻煩,只不過官方文檔比較少,下載到 source 之后,也不知道要如何 build。后來找到一個(gè)文檔,介紹了過程
cd winexe-1.00/source4
./autogen.sh
./configure
make
./bin/winexe -U “<user>%<password>” //<windows system> cmd.exe
2. 如何遠(yuǎn)程執(zhí)行,命令比較很簡(jiǎn)單,但又是環(huán)境問題,我們?cè)?windows 下面建立了一個(gè) administrators 組的用戶,但無(wú)法執(zhí)行,后來打開了 administrator 這個(gè)用戶,終于命令可以執(zhí)行了。
我們的腳本有兩個(gè)步驟,1. 殺掉舊進(jìn)程,2. 啟動(dòng)新的進(jìn)程,如下:
winexe -U "administrator%admin" //172.16.107.243 "taskkill /F /T /im java.exe"
cat < /dev/null | winexe -U "administrator%admin" //172.16.107.243 "java -jar c:\agent\job-agent.jar" >> /home/glodon/logs/agent243.log 2>&1 &
啟動(dòng)新進(jìn)程的時(shí)候,遇到了非常麻煩的事情,只能前臺(tái)執(zhí)行,nohup , & 這些完全不靈,如果 nohup,就會(huì)報(bào)錯(cuò),后來得到了一個(gè)方法,cat < /dev/null | winexe 解決了這個(gè)問題。
3. jenkins 執(zhí)行,jenkins 使用 Post Shell Plugin 來調(diào)用這個(gè)腳本,調(diào)用的時(shí)候一定要 nohup start.sh > /dev/null &,否則在執(zhí)行完之后,會(huì)發(fā)個(gè) sign,會(huì)把進(jìn)程結(jié)束掉。
注意,還必須要 > /dev/null,否則就會(huì)出錯(cuò),實(shí)在搞不明白原因。
弄好了這個(gè),以后就方便了,心情也挺好。
呵呵,有圖有真相。
用 ipad 發(fā)的 imessage,挺有意思的,不知不覺,孩子已經(jīng)這么大了。

@import url(/css/cuteeditor.css);
主要完成了下面4個(gè)工作
1. 創(chuàng)建一個(gè)本地的目錄結(jié)構(gòu),以存放 rpm 包
2. 啟動(dòng)一個(gè) apache,使這些文件能夠遠(yuǎn)程訪問
3. 寫一個(gè) spec,并且用 rpmbuild 做成一個(gè)安裝包,用來在機(jī)器上安裝新的 repository 位置
4. 使用 yum downloadonly plugin 將需要的 rpm 包放到本地目錄下,然后使用 createrepo 命令創(chuàng)建 metadata
本來是希望能有一個(gè)類似于 nexus 這樣的 proxy host server 將遠(yuǎn)程的 package cache 下來,找來找去,也找到了一個(gè) nexus yum plugin,但這個(gè) plugin 只支持手工的 deploy rpm package 到 nexus 上面,不能做 proxy 方式的。
寫寫步驟和遇到的問題吧。
準(zhǔn)備工作
- 安裝 createrepo, yum install createrepo
- 安裝 yum download only plugin, yum -y install yum-downloadonly
- 安裝 rpmbuild, yum -y install rpm-build
- 確認(rèn)已經(jīng)安裝了 apache nginx 之類的 http server
服務(wù)器步驟
- 首先是創(chuàng)建目錄結(jié)構(gòu),比如 mkdir -p /data/yum/centos/6/x86_64
- 先增加 chef 的源,rpm -Uvh http://rbel.frameos.org/rbel6
- 然后是通過 yum -y install rubygem-chef-server –downloadonly –downloaddir=/data/yum/centos/6/x86_64
- 這時(shí),已經(jīng)可以去掉 chef 的公共源了,rpm -e rbel6-release
- 創(chuàng)建本地庫(kù)的 metadata,createrepo /data/yum/centos/6/x86_64,還有一些參數(shù)可用,比如 -p, pretty xml, -d create sqlite database files
- 配置 apache,修改 /etc/httpd/conf/httpd.conf,修改 DocumentRoot 和 Directory 位置,改為 /data,并啟動(dòng) httpd -k start,也可以使用 chkconfig –level 3 https on,每次開機(jī)啟動(dòng)
客戶端步驟
- 首先要制作安裝 repository 位置的 rpm 包
- 創(chuàng)建文件 haha.repo,放到 /root/rpmbuild/SOURCES 目錄下,這個(gè)是將來 copy 到客戶端的 /etc/yum.repos.d/ 目錄下的配置文件,內(nèi)容為
[haha]
name=haha
baseurl=http://192.168.157.131/yum/centos/$releasever/$basearch/
enabled=1
gpgcheck=0
- 再創(chuàng)建文件 build spec 文件,放到 /root/rpmbuild/SOURCES 目錄下,是為了創(chuàng)建 rpm 包用的,haha.spec
Summary: haha
Name: haha
Version: 0.1
Release: 1
Source0: haha
Group: Applications/Internet
License: GPLv2+
URL: http://192.168.157.131/yum/
#BuildRoot: %{_tmppath}/%{name}-%{version}-root
BuildArch: noarch
%description
The haha yum repo
#%prep
#%setup -q
%install
mkdir -p $RPM_BUILD_ROOT/etc/yum.repos.d
install -m 0644 -p %{SOURCE0} $RPM_BUILD_ROOT/etc/yum.repos.d
%clean
rm -rf ${RPM_BUILD_ROOT}
%files
/etc/yum.repos.d/haha.repo
- 使用 rpmbuild -ba haha.spec,做出一個(gè) rpm 包,位置在 /root/rpmbuild/RPMS/noarch 下面
- 制作一次 rpm 后,就可以一直使用了,rpm -ivh xxx.rpm 就可以了
參考了
1. 自建yum源與制作RPM安裝包yum源
2. yum只下載rpm包不自動(dòng)安裝方法
3. Installing Chef Server 0.10 in RHEL 6
最近很少用鼠標(biāo)了,觸摸板還是沒有鼠標(biāo)靈活的,所以,很大希望都寄托在鍵盤上面了,快捷鍵就變成了優(yōu)先級(jí)最高的關(guān)注點(diǎn)。
Sublime Text 的快捷鍵總是零零散散記了一些的,今天才發(fā)現(xiàn),原來在 Preferences -> Key Bindings - Default 里面有全部的快捷鍵定義,以后不知道什么的時(shí)候,來看一眼就好了。
想了好久好久了,終于買到了。老婆送的生日禮物,老婆大人實(shí)在是太體貼了!
之前給朋友買了一個(gè)紅軸的機(jī)械鍵盤,只玩了幾把 dota 就給人了,也沒感覺到什么,反正我玩 dota 的水平提升了 10%,呵呵。
先說說拿到 hhkb 的感覺吧。
1. 個(gè)頭,比想象的還要小,60 鍵的小鍵盤實(shí)在是太小了,喜歡!
2. 鍵盤包,我還順便買了一個(gè)放 hhkb 的包,也是從日本帶回來的(最近因?yàn)槟橙酸烎~的問題,搞得我怪緊張的),拿回來了才發(fā)現(xiàn),made in china,nnd,這東西國(guó)內(nèi)居然還買不到!實(shí)在是無(wú)語(yǔ)
3. 鍵位,剛開始的時(shí)候,對(duì) Delete 的位置很不習(xí)慣,大概用了一個(gè)小時(shí)左右,大概習(xí)慣了。Ctrl 的位置是之前一直在用的,所以非常舒服。比較糾結(jié)的是方向鍵,我之前還以為左邊會(huì)有一個(gè) fn 鍵給我組合,沒想到 pro 沒有,只有 lite 才有,pro 只有右邊有一個(gè) fn,只好在需要方向鍵的時(shí)候,手離開主鍵盤區(qū)了。
4. 手感,手感實(shí)在是無(wú)與倫比了,用了這個(gè)打字之后,就不太愿意回到 mac 的巧克力鍵盤上了,差別的確有些大。
5. 聲音,這玩意聲音還有點(diǎn)兒大啊,比我之前想得還要大一些,在辦公室的環(huán)境下,應(yīng)該是不會(huì)影響到什么的,之前還是有點(diǎn)兒心虛,怕影響到別的,后來漸漸習(xí)慣了,發(fā)現(xiàn)別人根本就聽不到,也就慢慢的放心了。呵呵
工作中遇到問題吧
因?yàn)橹饕?Java 開發(fā),所以 IDE 主要用的是 Eclipse,Eclipse 里面用 hhkb 有兩個(gè)比較麻煩的地方:
1. 經(jīng)常要用到方向鍵,比如語(yǔ)法提示之后,需要用上下來選擇你要的那個(gè),這個(gè)我用 keyremap4mac 把 Ctrl + N 和 Ctrl + P 直接改成上下了,可以用了。
2. Eclipse 經(jīng)常要用到 Fx 鍵,這個(gè)相當(dāng)麻煩,比如,切換 Editor 要 Cmd + F6,換 View 要 Cmd + F7,換視圖要 Cmd + F8,執(zhí)行最后執(zhí)行的程序要 Cmd + Shift + F11,這時(shí)候,我就會(huì)發(fā)現(xiàn),我已經(jīng)有點(diǎn)兒搞不定了,沒辦法,我估計(jì)我要去修改 Eclipse 的快捷鍵了,因?yàn)槟莻€(gè) Cmd + F11 實(shí)在是太常用了。
遇到開心的事兒
在 Terminal 下面,用起來非常舒服的,這個(gè)鍵盤本來就是為了 vi , emacs 之類的東西存在的,在 Termial 標(biāo)準(zhǔn)的 Emacs 快捷鍵下,用起來非常好,基本不用想什么,就一切都很順利了。
在 OS X 系統(tǒng)下,大部分時(shí)候 Emacs 的快捷鍵 Ctrl + fbnpaek 這些快捷鍵都是好用的,也是比較舒服的原因之一,但 Option + fbd 這類的快捷鍵經(jīng)常不能用,比較郁悶。
無(wú)論如何,這個(gè)鍵盤還是帶給了我不少的快樂,首先達(dá)到了 Happy 的效果,以后慢慢的來體會(huì) Hacking 的感覺吧。
加油!
http://dev.mysql.com/doc/refman/5.5/en/connector-j-reference-implementation-notes.html
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
ResultSet
By default, ResultSets are completely retrieved and stored in memory. In most cases this is the most efficient way to operate, and due to the design of the MySQL network protocol is easier to implement. If you are working with ResultSets that have a large number of rows or large values, and cannot allocate heap space in your JVM for the memory required, you can tell the driver to stream the results back one row at a time.
To enable this functionality, create a Statement
instance in the following manner:
stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,
java.sql.ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(Integer.MIN_VALUE);
The combination of a forward-only, read-only result set, with a fetch size of Integer.MIN_VALUE
serves as a signal to the driver to stream result sets row-by-row. After this, any result sets created with the statement will be retrieved row-by-row.
There are some caveats with this approach. You must read all of the rows in the result set (or close it) before you can issue any other queries on the connection, or an exception will be thrown.
The earliest the locks these statements hold can be released (whether they be MyISAM
table-level locks or row-level locks in some other storage engine such as InnoDB
) is when the statement completes.
If the statement is within scope of a transaction, then locks are released when the transaction completes (which implies that the statement needs to complete first). As with most other databases, statements are not complete until all the results pending on the statement are read or the active result set for the statement is closed.
Therefore, if using streaming results, process them as quickly as possible if you want to maintain concurrent access to the tables referenced by the statement producing the result set.
在 Mac 上配置 Apache 和 SVN 極其方便。
序:
之前在 Windows 上,因?yàn)樾睦锩赖脑颍渲眠^ Apache 和 SVN 集成,使用 http 協(xié)議來訪問 SVN。配置過程有些麻煩,也容易出錯(cuò)。
后來,一直使用 svnserve -d,在 windows 上一般還會(huì)用 sc 命令做成 service,因?yàn)楹?jiǎn)單方便。
后來因?yàn)樵囼?yàn)的目的,在 Mac 上配置了 Apache 和 SVN,我的 OS X 是 10.7 Lion
居然極其簡(jiǎn)單,只要在“系統(tǒng)偏好設(shè)置” -> “共享” 中,把 Web 共享打開,然后把個(gè)人網(wǎng)站點(diǎn)開(僅僅是不想修改全局配置文件)
然后修改文件 /private/etc/apache2/users/你的用戶名.conf ,里面加上
# svn module
LoadModule dav_svn_module libexec/apache2/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache2/mod_authz_svn.so
<Location /svn>
DAV svn
SVNListParentPath on
SVNParentPath "/repository/svn/path"
</Location>
就可以了,
兩個(gè) svn 相關(guān)的 module 已經(jīng)放好了,只要 load 一下就行。
配置方面還可以增加認(rèn)證等等。為了權(quán)限管理得更細(xì)致,也可以使用 SVNPath 而不是 SVNParentPath。
唉,真是方便,Mac 用來開發(fā),不錯(cuò)!
ssh 免密碼登錄,需要使用公私鑰來認(rèn)證@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
首先通過 ssh-keygen 生成一對(duì)公私鑰,默認(rèn)在 ~/.ssh/id_rsa.pub 和 ~/.ssh/id_rsa,前面的是公鑰。
認(rèn)證就是要把這個(gè)文件加到遠(yuǎn)程用戶目錄 ~/.ssh/authorized_keys 文件中,而且這個(gè)文件的權(quán)限不能被其它人訪問。
下面的腳本能夠自動(dòng)把這個(gè)文件放到遠(yuǎn)程,方法是 ./addpk ip username password
#!//usr/bin/expect
set host [lrange $argv 0 0]
set user [lrange $argv 1 1]
set passwd [lrange $argv 2 2]
proc ssh {cmd} {
global user host passwd
spawn ssh $user@$host "$cmd"
expect {
"*conne*" {
send "yes\n"
expect "*password*"
send "$passwd\n"
expect eof
}
"*password*" {
send "$passwd\n"
expect eof
}
}
}
proc scp {src dest} {
global user host passwd
spawn scp $src $user@$host:$dest
expect {
"*conne*" {
send "yes\n"
expect "*password*"
send "$passwd\n"
expect eof
}
"*password*" {
send "$passwd\n"
expect eof
}
}
}
ssh "mkdir -p ~/.ssh"
scp "/home/user1/.ssh/id_rsa.pub" "~/.ssh/id_rsa.pub"
ssh "cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys"
ssh "uniq ~/.ssh/authorized_keys > ~/.ssh/authorized_keys.tmp"
ssh "mv ~/.ssh/authorized_keys.tmp ~/.ssh/authorized_keys"
ssh "chmod 700 ~/.ssh"
ssh "chmod 600 ~/.ssh/*"
在 Eclipse 中執(zhí)行下面代碼。
byte[] bytes = new byte[]{-16, -97, -116, -70};
String s = new String(bytes, "UTF-8");
System.out.println(s);
結(jié)果打印出了一朵花,呵呵,實(shí)在是太有意思了。
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
Picasa 像冊(cè)真的很給力,2048 像素以下(包含)的照片不計(jì)算空間,據(jù)說 15 分鐘以內(nèi)的也不算空間,除了這些,有1G的空間可以使用。
我現(xiàn)在用的 Aperture 或者是 iPhoto 都有 Picasa Plugin,上傳照片非常方便,除了需要fanqiang外,沒什么其它問題了。
雖然 Aperture 和 Facebook, Flickr 好像集成的更好,可實(shí)際上,F(xiàn)acebook 像素低,還不能選,F(xiàn)lickr 空間有要求。
這個(gè)文件已經(jīng)在 /Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Classes/classes.jar
這里了,我在混淆代碼的時(shí)候會(huì)用到,只要做個(gè) link 就好了,如下:
sudo ln -s /Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Classes/classes.jar /Library/Java/JavaVirtualMachines/1.6.0_29-b11-402.jdk/Contents/Home/lib/rt.jar
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
目前有一個(gè) 10 臺(tái)機(jī)器的小網(wǎng),只有其中一臺(tái)機(jī)器能夠通過外網(wǎng)訪問,其它機(jī)器需要先 ssh 到外網(wǎng)機(jī)器,然后再 ssh 一下,才能訪問到,很麻煩,一些 scp 之類的軟件也沒法使用。之前,我一直是用 secure crt 端口轉(zhuǎn)發(fā)來做的,也算方便,缺點(diǎn)就是一直要開一個(gè) secure crt 窗口,還不能斷,否則就全斷開了。
后來同事告訴了我一個(gè)辦法,叫 iptables,利用這臺(tái)外網(wǎng)機(jī)器自己來進(jìn)行轉(zhuǎn)發(fā),試了一下,的確要更方便一些。
iptables 本身是用來做 linux 防火墻的,還有一些轉(zhuǎn)發(fā)功能。
配置起來比較方便。iptables 的配置文件是放在 /etc/sysconfig/iptables 下面的,缺省是沒有這個(gè)文件的,需要先執(zhí)行
外網(wǎng)機(jī)器:
外網(wǎng) ip: 202.118.1.125
內(nèi)網(wǎng) ip: 111.111.111.111
端口: 8112
內(nèi)網(wǎng)機(jī)器:
ip: 111.111.111.112
命令:
iptables -t nat -A PREROUTING -d 202.118.1.125 -p tcp --dport 8112 -j DNAT --to-destination 111.111.111.112:22
iptables -t nat -A POSTROUTING -d 111.111.111.112 -p tcp --dport 22 -j SNAT --to 111.111.111.111
iptables -A FORWARD -o eth0 -d 111.111.111.112 -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -i eth0 -s 111.111.111.112 -p tcp --sport 22 -j ACCEPT
然后再 iptables-save 這個(gè)文件就出來了。
通過 service iptables restart 就可以啟動(dòng) iptables 服務(wù)。
奇怪的是 111.111.111.111 這臺(tái)機(jī)器并沒有 listen 8112 的端口,但你只要 ssh 202.118.1.125 8112,就真的能夠連到 111.111.111.112 這臺(tái)機(jī)器上,算是留下一個(gè)疑問吧。
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
L-Larry_Lau@163.com#24777-1i8da63tvtyl2#1119
L-Larry_Lau@163.com#61624-1dvrt8wj18v1#6260
L-Larry_Lau@163.com#50028-se4zkrr1m6t1#10246
L-Larry_Lau@163.com#15600-189y158nwwvuk#339
L-Larry_Lau@163.com#30640-1lklqdbcjmhxs#4016
L-Larry_Lau@163.com#57474-53b2wr1311gnz#10228
L-Larry_Lau@163.com#19667-11r2awc10nqelb#4016
L-Larry_Lau@163.com#60353-pphob7wraf0y#515
L-Larry_Lau@163.com#65157-1ae6ytp7ygj8m#0012
L-Larry_Lau@163.com#16226-1n5h5951019s7s#7343
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
問題:
1. centos 5.5 通過 yum 安裝 mysql,啟動(dòng),一切正常。但是,修改 my.cnf 中的 datadir 到自定義目錄,并初始化好數(shù)據(jù)庫(kù),使用原來的 mysql 文件就無(wú)法啟動(dòng)了。
2. 通過 heartbeat 啟動(dòng) mysql 遇到同樣的問題。
解決:
修改 /etc/selinux/config 文件中的 SELINUX=disabled,就可以運(yùn)行了。
過程:
定位問題的過程中,發(fā)現(xiàn),只要 copy 出來的 mysql 腳本,就可以執(zhí)行,原來的依然不可以。或者 mysql 數(shù)據(jù)庫(kù)文件放到 /var/lib/mysql 下,就可以,其它位置,就不行。
猜測(cè),文件屬性有什么不一樣的?通過 ls -l 看權(quán)限,和 lsattr 看屬性,都一模一樣。
但,知道原因后,使用 ls -Z 可以看到 selinux 相關(guān)的屬性,這些文件是不一樣的。
原因:
不太清楚原因,但肯定的是,selinux 相關(guān)屬性影響的,有空仔細(xì)看看相關(guān)文檔。
下面這篇寫得不錯(cuò):
http://www.linux.gov.cn/netweb/selinux.htm
SELinux簡(jiǎn)介
SELinux全稱是Security Enhanced Linux,由美國(guó)國(guó)家安全部(National Security Agency)領(lǐng)導(dǎo)開發(fā)的GPL項(xiàng)目,它擁有一個(gè)靈活而強(qiáng)制性的訪問控制結(jié)構(gòu),旨在提高Linux系統(tǒng)的安全性,提供強(qiáng)健的安全保證,可防御未知攻擊,據(jù)稱相當(dāng)于B1級(jí)的軍事安全性能。比MS NT所謂的C2等高得多。
應(yīng)用SELinux后,可以減輕惡意攻擊或惡意軟件帶來的災(zāi)難,并提供對(duì)機(jī)密性和完整性有很高要求的信息很高的安全保障。 SELinux vs Linux 普通Linux安全和傳統(tǒng)Unix系統(tǒng)一樣,基于自主存取控制方法,即DAC,只要符合規(guī)定的權(quán)限,如規(guī)定的所有者和文件屬性等,就可存取資源。在傳統(tǒng)的安全機(jī)制下,一些通過setuid/setgid的程序就產(chǎn)生了嚴(yán)重安全隱患,甚至一些錯(cuò)誤的配置就可引發(fā)巨大的漏洞,被輕易攻擊。
而SELinux則基于強(qiáng)制存取控制方法,即MAC,透過強(qiáng)制性的安全策略,應(yīng)用程序或用戶必須同時(shí)符合DAC及對(duì)應(yīng)SELinux的MAC才能進(jìn)行正常操作,否則都將遭到拒絕或失敗,而這些問題將不會(huì)影響其他正常運(yùn)作的程序和應(yīng)用,并保持它們的安全系統(tǒng)結(jié)構(gòu)。
SELinux的相關(guān)配置文件
SELinux的配置相關(guān)文件都在/etc/selinux下,其中/etc/selinux/targeted目錄里就包含了策略的詳細(xì)配置和context定義,以下是主要文件及功用:
/etc/selinux/targeted/contexts/*_context 默認(rèn)的context設(shè)置
/etc/selinux/targeted/contexts/files/* 精確的context類型劃分
/etc/selinux/targeted/policy/* 策略文件
Apache under SELinux
Apache under SELinux - 讓Apache跑得順起來!
對(duì)于剛使用Redhat Enterprise Linux 4 或Fedora Core 2以上/CentOS 4的用戶,一定會(huì)為Apache經(jīng)常無(wú)法正常運(yùn)轉(zhuǎn),報(bào)以"Permission denied"等錯(cuò)誤而大為不解,甚至大為惱火。
其實(shí)這是因?yàn)檫@些系統(tǒng)里激活了SELinux,而用戶的apache配置與SELinux的配置策略有抵觸產(chǎn)生的,只有通過適當(dāng)調(diào)整,使apache的配置和訪問符合策略才能正常使用。
現(xiàn)在下面來分析一下SELinux中有關(guān)httpd(apache)的context定義(略有刪節(jié))
/home/[^/]+/((www)|(web)|(public_html))(/.+)? system_u:object_r:httpd_user_content_t
/var/www(/.*)? system_u:object_r:httpd_sys_content_t
/var/www/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
/usr/lib/cgi-bin(/.*)? system_u:object_r:httpd_sys_script_exec_t
/var/www/perl(/.*)? system_u:object_r:httpd_sys_script_exec_t
/var/www/icons(/.*)? system_u:object_r:httpd_sys_content_t
/var/cache/httpd(/.*)? system_u:object_r:httpd_cache_t
/etc/vhosts -- system_u:object_r:httpd_config_t
/usr/sbin/httpd -- system_u:object_r:httpd_exec_t
/usr/sbin/apache(2)? -- system_u:object_r:httpd_exec_t
/usr/sbin/suexec -- system_u:object_r:httpd_suexec_exec_t
/var/log/httpd(/.*)? system_u:object_r:httpd_log_t
/var/log/apache(2)?(/.*)? system_u:object_r:httpd_log_t
/var/log/cgiwrap\.log.* -- system_u:object_r:httpd_log_t
/var/cache/ssl.*\.sem -- system_u:object_r:httpd_cache_t
/var/cache/mod_ssl(/.*)? system_u:object_r:httpd_cache_t
/var/run/apache(2)?\.pid.* -- system_u:object_r:httpd_var_run_t
/var/lib/httpd(/.*)? system_u:object_r:httpd_var_lib_t
/var/lib/php/session(/.*)? system_u:object_r:httpd_var_run_t
/etc/apache-ssl(2)?(/.*)? system_u:object_r:httpd_config_t
/usr/lib/apache-ssl(/.*)? -- system_u:object_r:httpd_exec_t
/usr/sbin/apache-ssl(2)? -- system_u:object_r:httpd_exec_t
/var/log/apache-ssl(2)?(/.*)? system_u:object_r:httpd_log_t
/var/run/apache-ssl(2)?\.pid.* -- system_u:object_r:httpd_var_run_t
/var/run/gcache_port -s system_u:object_r:httpd_var_run_t
/var/lib/squirrelmail/prefs(/.*)? system_u:object_r:httpd_squirrelmail_t
/usr/bin/htsslpass -- system_u:object_r:httpd_helper_exec_t
/usr/share/htdig(/.*)? system_u:object_r:httpd_sys_content_t
/var/lib/htdig(/.*)? system_u:object_r:httpd_sys_content_t
針對(duì)上述的內(nèi)容,可以對(duì)如下的幾個(gè)常見問題進(jìn)行簡(jiǎn)單處理:
1.phpmyadmin在非默認(rèn)/var/www/html目錄下無(wú)法運(yùn)轉(zhuǎn)
通常類似的情況都是在配置了虛擬主機(jī)時(shí),訪問/phpmyadmin等提示403訪問拒絕,日志里也提示Permission denied,這是因?yàn)閜hpmyadmin防止的目錄及文件本身屬性不符合context要求。
假設(shè)phpmyadmin放在/web目錄下,那么執(zhí)行:
chcon -R -t httpd_user_content_t /web
則會(huì)令/web及其下所有子目錄/文件,包括phpmyadmin文件都獲得了httpd_user_content_t的屬性,如果其傳統(tǒng)的Unix屬性對(duì)httpd來說是可讀的話,再重新訪問一下就應(yīng)該可以了。
2./home目錄下的虛擬主機(jī)無(wú)法運(yùn)轉(zhuǎn)
與問題1也是類似的,不過根據(jù)上文中context的定義,/home目錄下必須是用戶的$HOME/www或public_html或web目錄才是 httpd_user_content_t類型,因此建議將要作為web頁(yè)面的內(nèi)容放置在用戶的$HOME/www或web或public_html里,并確保其屬性是httpd_user_content_t,使用如下命令查看:
ls -Z /home/abc/
drwxr-xr-x abc abc user_u:object_r:user_home_dir_t tmp
drwxrwxr-x abc abc user_u:object_r:httpd_user_content www
如不是,則可通過chcon來逐級(jí)目錄及文件更改,直至最后能訪問:
chcon -R -t httpd_user_content_t /home/abc/web
chcon -t user_home_dir_t /home/abc
3.CGI程序無(wú)法運(yùn)行
如果cgi程序放在/var/www/cgi-bin/里也無(wú)法執(zhí)行,遇到403或500錯(cuò)誤的話,可以檢查cgi程序的屬性,按SELinux contexts文件里定義的,/var/www/cgi-bin/里必須是httpd_sys_script_exec_t 屬性。通過ls -Z查看,如果不是則通過如下命令更改:
chcon -t httpd_sys_script_exec_t /var/www/cgi-bin/*.cgi
如果是虛擬主機(jī)里的cgi,則參考問題2使之能正常使用普通的功能后,再通過chcon設(shè)置cgi文件的context為httpd_sys_script_exec_t即可。
4.Setuid/gid 程序無(wú)法運(yùn)行
例如早期的SqWebMail及qmailadmin等,需要setuid/gid的支持,但在SELinux下這將受到嚴(yán)格限制。第一種方法是比較徹底的辦法,能保留系統(tǒng)的安全性,通過:
audit2allow -l -i /var/log/messages
將SELinux拒絕的信息轉(zhuǎn)換為相應(yīng)的policy allow指令,將這些指令添加到SELinux policy 的src里相應(yīng)的配置文件,重新生成policy并加載。但這樣做相對(duì)比較麻煩。
另一個(gè)方法最簡(jiǎn)單,但將使apache得不到保護(hù)。首先確定SELinux 類型是targeted的:
cat /etc/selinux/config|grep SELINUXTYPE
然后,使apache脫離SELinux保護(hù):
setsebool -P httpd_disable_trans 1
然后重啟動(dòng)apache:
/etc/init.d/httpd restart
這樣所有apache強(qiáng)制的檢查都失效,需要setuid/gid的程序可以正常使用。但這樣帶來了增加漏洞的危險(xiǎn),對(duì)于迫切需要運(yùn)行而又很急的情況,本方法是一個(gè)最大限度減少系統(tǒng)安全缺失的最后辦法。對(duì)于取消SELinux 未必是一個(gè)好方法。
SElinux的幾個(gè)相關(guān)命令
一.
ps -Z
ls -Z
id -Z
例:
[root@ljj cgi-bin]# ls -Z
-rwxrwxrwx root root root:object_r:httpd_sys_script_exec_t a.cgi
-rw-r--r-- root root root:object_r:httpd_sys_script_exec_t a.txt
二. chcon
修改文件的屬性 fild1:fild2:fild3
chcon -u fild1 file
chcon -l fild2 file
chcon -t fild3 file
例:
chcon -u root file1
三.getsebool
獲取se相關(guān)的bool值
例:
[root@ljj cgi-bin]# getsebool -a | grep httpd
httpd_builtin_scripting --> inactive
httpd_disable_trans --> active
httpd_enable_cgi --> active
httpd_enable_homedirs --> active
httpd_ssi_exec --> active
httpd_tty_comm --> inactive
httpd_unified --> inactive
得到了一些與httpd相關(guān)的bool值,配置httpd.conf中的user_dir時(shí),要保證這里的httpd_enable_homedirs是 active的,還要保證:
chcon -R -t httpd_sys_content_t ~user/public_html;
- httpd與selinux之間的關(guān)系更多詳見:man httpd_selinux
四. togglesebool
給se的相關(guān)bool值取反
例:
togglesebool httpd_enable_homedirs
本次操作環(huán)境:
Ubuntu Server 10.10
SCSI Harddisk:/dev/sda 500GB
U盤:/dev/sdb 8GB(模擬成USB Harddisk,安裝OS)
介紹2種分區(qū)表:
MBR分區(qū)表:(MBR含義:主引導(dǎo)記錄)
所支持的最大卷:2T (T; terabytes,1TB=1024GB)
對(duì)分區(qū)的設(shè)限:最多4個(gè)主分區(qū)或3個(gè)主分區(qū)加一個(gè)擴(kuò)展分區(qū)。
GPT分區(qū)表:(GPT含義:GUID分區(qū)表)
支持最大卷:18EB,(E:exabytes,1EB=1024TB)
每個(gè)磁盤最多支持128個(gè)分區(qū)
所以如果要大于2TB的卷或分區(qū)就必須得用GPT分區(qū)表。
Linux下fdisk工具不支持GPT,得使用另一個(gè)GNU發(fā)布的強(qiáng)大分區(qū)工具parted。
fdisk工具用的話,會(huì)有下面的警告信息:
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.
下面是用parted工具對(duì)/dev/sda做GPT分區(qū)的過程:
root@node01:/mnt# parted /dev/sda
GNU Parted 2.3
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt
Warning: The existing disk label on /dev/sda will be destroyed and all data on this disk
will be lost. Do you want to continue?
Yes/No? yes
(parted) print
Model: DELL PERC 6/i Adapter (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
(parted)mkpart primary 0KB 500GB
Warning: You requested a partition from 0.00B to 500GB.
The closest location we can manage is 17.4kB to 500GB.
Is this still acceptable to you?
Yes/No? yes
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
(parted) print
Model: DELL PERC 6/i Adapter (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 17.4kB 500GB 500GB primary
(parted)quit
Information: You may need to update /etc/fstab.
root@node01:/#fdisk -l
WARNING: GPT (GUID Partition Table) detected on '/dev/sda'! The util fdisk doesn't support GPT. Use GNU Parted.
Disk /dev/sda: 499.6 GB, 499558383616 bytes
255 heads, 63 sectors/track, 60734 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/sda1 1 60735 487849983+ ee GPT
root@node01:/#mkfs.ext4 /dev/sda1
mke2fs 1.41.12 (17-May-2010)
文件系統(tǒng)標(biāo)簽=
操作系統(tǒng):Linux
塊大小=4096 (log=2)
分塊大小=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
30490624 inodes, 121962487 blocks
6098124 blocks (5.00%) reserved for the super user
第一個(gè)數(shù)據(jù)塊=0
Maximum filesystem blocks=4294967296
3722 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000
正在寫入inode表: 完成
Creating journal (32768 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 24 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
root@node01:/#mount /dev/sda1 /export/glusterfs01/
root@node01:/# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/node01-root
6.8G 987M 5.5G 16% /
none 7.9G 208K 7.9G 1% /dev
none 7.9G 0 7.9G 0% /dev/shm
none 7.9G 32K 7.9G 1% /var/run
none 7.9G 0 7.9G 0% /var/lock
/dev/sdb1 228M 21M 196M 10% /boot
/dev/sda1 458G 198M 435G 1% /export/glusterfs01
root@node01:/#vi /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s UUID' to print the universally unique identifier
# for a device; this may be used with UUID= as a more robust way to name
# devices that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
proc /proc proc nodev,noexec,nosuid 0 0
/dev/mapper/node01-root / ext4 errors=remount-ro 0 1
# /boot was on /dev/sdb1 during installation
UUID=c21707ff-ba0f-43ee-819a-8e72fa0f8500 /boot ext2 defaults 0 2
/dev/mapper/node01-swap_1 none swap sw 0 0
/dev/sda1 /export/glusterfs01 ext4 defaults 0 2
重啟就可以自動(dòng)掛載了!至此完成。
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
posted @
2011-12-21 15:56 哈哈的日子 閱讀(16468) |
評(píng)論 (0) |
編輯 收藏
1. cross join 就是笛卡爾積
那看起來好象和 inner join 是一樣的,在 SQL 標(biāo)準(zhǔn)中定義的是 cross join 就是沒有條件的 inner join。在 mysql 中,不區(qū)分,這兩個(gè)等價(jià)。
2. natural (left) join 是把兩個(gè)表名字一樣的列,做相等條件處理,比如:
t1
id1 name
t2
id2 name
那么 select t1.id1, t2.id1, t1.name from t1 natural join t2 就等價(jià)
select t1.id1, t2.id1, t1.name from t1 join t2 on (t1.name = t2.name)
自動(dòng)把一樣名稱的列(name)做了個(gè)相待條件處理,多列也會(huì)同時(shí)處理。
所以,這兩種 join 沒人用是有原因的。
cross join 沒意義,一般用逗號(hào)就可以了。
natural 降低了可讀性,不建議使用。
一個(gè)好軟件,會(huì)讓人覺得賞心悅目
會(huì)讓人心曠神怡
會(huì)開心
會(huì)……
H2DB 就是這樣的一個(gè)好軟件,就一個(gè)感覺----舒服!
比如:group by sort 的實(shí)現(xiàn)
private void queryGroupSorted(int columnCount, ResultTarget result) {
int rowNumber = 0;
setCurrentRowNumber(0);
Value[] previousKeyValues = null;
while (topTableFilter.next()) {
setCurrentRowNumber(rowNumber + 1);
if (condition == null || Boolean.TRUE.equals(condition.getBooleanValue(session))) {
rowNumber++;
Value[] keyValues = new Value[groupIndex.length];
// update group
for (int i = 0; i < groupIndex.length; i++) {
int idx = groupIndex[i];
Expression expr = expressions.get(idx);
keyValues[i] = expr.getValue(session);
}
if (previousKeyValues == null) {
previousKeyValues = keyValues;
currentGroup = New.hashMap();
} else if (!Arrays.equals(previousKeyValues, keyValues)) {
addGroupSortedRow(previousKeyValues, columnCount, result);
previousKeyValues = keyValues;
currentGroup = New.hashMap();
}
currentGroupRowId++;
for (int i = 0; i < columnCount; i++) {
if (groupByExpression == null || !groupByExpression[i]) {
Expression expr = expressions.get(i);
expr.updateAggregate(session);
}
}
}
}
if (previousKeyValues != null) {
addGroupSortedRow(previousKeyValues, columnCount, result);
}
}
看著太舒服了。
http://ivansmirnov.wordpress.com/2011/03/19/java-util-concurrent-locks-thread-dump/
The Sun JVM setting “-XX:+PrintConcurrentLocks” adds the lock owner information to the thread dump.
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
http://en.wikipedia.org/wiki/Category:Unix_signals
1.SIGHUP信號(hào)
UNIX中進(jìn)程組織結(jié)構(gòu)為 session (會(huì)話)包含一個(gè)前臺(tái)進(jìn)程組及一個(gè)或多個(gè)后臺(tái)進(jìn)程組,一個(gè)進(jìn)程組包含多個(gè)進(jìn)程。一個(gè)session可能會(huì)有一個(gè)session首進(jìn)程,而一個(gè)session首進(jìn)程可能會(huì)有一個(gè)控制終端。一個(gè)進(jìn)程組可能會(huì)有一個(gè)進(jìn)程組首進(jìn)程。進(jìn)程組首進(jìn)程的進(jìn)程ID與該進(jìn)程組ID相等。這兒是可能會(huì)有,在一定情況之下是沒有的。與終端交互的進(jìn)程是前臺(tái)進(jìn)程,否則便是后臺(tái)進(jìn)程。
SIGHUP會(huì)在以下3種情況下被發(fā)送給相應(yīng)的進(jìn)程:
1、終端關(guān)閉時(shí),該信號(hào)被發(fā)送到session首進(jìn)程以及作為job提交的進(jìn)程(即用 & 符號(hào)提交的進(jìn)程)
2、session首進(jìn)程退出時(shí),該信號(hào)被發(fā)送到該session中的前臺(tái)進(jìn)程組中的每一個(gè)進(jìn)程
3、若父進(jìn)程退出導(dǎo)致進(jìn)程組成為孤兒進(jìn)程組,且該進(jìn)程組中有進(jìn)程處于停止?fàn)顟B(tài)(收到SIGSTOP或SIGTSTP信號(hào)),該信號(hào)會(huì)被發(fā)送到該進(jìn)程組中的每一個(gè)進(jìn)程。
系統(tǒng)對(duì)SIGHUP信號(hào)的默認(rèn)處理是終止收到該信號(hào)的進(jìn)程。所以若程序中沒有捕捉該信號(hào),當(dāng)收到該信號(hào)時(shí),進(jìn)程就會(huì)退出。
下面觀察幾種因終端關(guān)閉導(dǎo)致進(jìn)程退出的情況,在這兒進(jìn)程退出是因?yàn)槭盏搅薙IGHUP信號(hào)。login shell是session首進(jìn)程。
首先寫一個(gè)測(cè)試程序,代碼如下:
#include <stdio.h>
#include <signal.h>
char **args;
void exithandle(int sig)
{
printf("%s : sighup received ",args[1]);
}
int main(int argc,char **argv)
{
args = argv;
signal(SIGHUP,exithandle);
pause();
return 0;
}
程序中捕捉SIGHUP信號(hào)后打印一條信息,pause()使程序暫停。
編譯后的執(zhí)行文件為sigtest。
1、命 令:sigtest front > tt.txt
操 作:關(guān)閉終端
結(jié) 果:tt.txt文件的內(nèi)容為front : sighup received
原 因: sigtest是前臺(tái)進(jìn)程,終端關(guān)閉后,根據(jù)上面提到的第1種情況,login shell作為session首進(jìn)程,會(huì)收到SIGHUP信號(hào)然后退出。根據(jù)第2種情況,sigtest作為前臺(tái)進(jìn)程,會(huì)收到login shell發(fā)出的SIGHUP信號(hào)。
2、命 令:sigtest back > tt.txt &
操 作:關(guān)閉終端
結(jié) 果:tt.txt文件的內(nèi)容為 back : sighup received
原 因: sigtest是提交的job,根據(jù)上面提到的第1種情況,sigtest會(huì)收到SIGHUP信號(hào)。
3、命 令:寫一個(gè)shell,內(nèi)容為[sigtest &],然后執(zhí)行該shell
操 作:關(guān)閉終端
結(jié) 果:ps -ef | grep sigtest 會(huì)看到該進(jìn)程還在,tt文件為空
原 因: 執(zhí)行該shell時(shí),sigtest作為job提交,然后該shell退出,致使sigtest變成了孤兒進(jìn)程,不再是當(dāng)前session的job了,因此sigtest即不是session首進(jìn)程也不是job,不會(huì)收到SIGHUP。同時(shí)孤兒進(jìn)程屬于后臺(tái)進(jìn)程,因此login shell退出后不會(huì)發(fā)送SIGHUP給sigtest,因?yàn)樗粚⒃撔盘?hào)發(fā)送給前臺(tái)進(jìn)程。第3條說過若進(jìn)程組變成孤兒進(jìn)程組的時(shí)候,若有進(jìn)程處于停止?fàn)顟B(tài),也會(huì)收到SIGHUP信號(hào),但sigtest沒有處于停止?fàn)顟B(tài),所以不會(huì)收到SIGHUP信號(hào)。
4、命 令:nohup sigtest > tt
操 作:關(guān)閉終端
結(jié) 果:tt文件為空
原 因: nohup可以防止進(jìn)程收到SIGHUP信號(hào)
至此,我們就清楚了何種情況下終端關(guān)閉后進(jìn)程會(huì)退出,何種情況下不會(huì)退出。
要想終端關(guān)閉后進(jìn)程不退出有以下幾種方法,均為通過shell的方式:
1、編寫shell,內(nèi)容如下
trap "" SIGHUP #該句的作用是屏蔽SIGHUP信號(hào),trap可以屏蔽很多信號(hào)
sigtest
2、nohup sigtest 可以直接在命令行執(zhí)行,
若想做完該操作后繼續(xù)別的操作,可以 nohup sigtest &
3、編寫shell,內(nèi)容如下
sigtest &
其實(shí)任何將進(jìn)程變?yōu)楣聝哼M(jìn)程的方式都可以,包括fork后父進(jìn)程馬上退出。
2.SIGCHLD信號(hào)
子進(jìn)程死后,會(huì)發(fā)送SIGCHLD信號(hào)給父進(jìn)程。
一個(gè)進(jìn)程在調(diào)用exit命令結(jié)束自己的生命的時(shí)候,其實(shí)它并沒有真正的被銷毀,而是留下一個(gè)稱為僵尸進(jìn)程(Zombie)的數(shù)據(jù)結(jié)構(gòu)(系統(tǒng)調(diào)用exit,它的作用是使進(jìn)程退出,但也僅僅限于將一個(gè)正常的進(jìn)程變成一個(gè)僵尸進(jìn)程,并不能將其完全銷毀)。在Linux進(jìn)程的狀態(tài)中,僵尸進(jìn)程 是非常特殊的一種,它已經(jīng)放棄了幾乎所有內(nèi)存空間,沒有任何可執(zhí)行代碼,也不能被調(diào)度,僅僅在進(jìn)程列表中保留一個(gè)位置,記載該進(jìn)程的退出狀態(tài)等信息供其他進(jìn)程收集,除此之外,僵尸進(jìn)程不再占有任何內(nèi)存空間。它需要它的父進(jìn)程來為它收尸,如果他的父進(jìn)程沒安裝SIGCHLD信號(hào)處理函數(shù)調(diào)用wait或waitpid()等待子進(jìn)程結(jié)束,又沒有顯式忽略該信號(hào),那么它就一直保持僵尸狀態(tài),如果這時(shí)父進(jìn)程結(jié)束了,那么init進(jìn)程自動(dòng)會(huì)接手這個(gè)子進(jìn)程,為它收尸,它還是能被清除的。但是如果如果父進(jìn)程是一個(gè)循環(huán),不會(huì)結(jié)束,那么子進(jìn)程就會(huì)一直保持僵尸狀態(tài),這就是為什么系統(tǒng)中有時(shí)會(huì)有很多的僵尸進(jìn)程。
2.SIGTERM信號(hào)
kill() 可以發(fā) SIGTERM 過去;kill 命令默認(rèn)也使用 SIGTERM 信號(hào)。
SIGTERM 信號(hào)的處理函數(shù),常見的是用來清理、退出;或者程序可以忽略這個(gè)信號(hào),以防誤殺。
SIGTERM is the default signal sent to a process by the kill or killall commands. It causes the termination of a process, but unlike the SIGKILLsignal, it can be caught and interpreted (or ignored) by the process. Therefore, SIGTERM is more akin to asking a process to terminate nicely, allowing cleanup and closure of files. For this reason, on many Unix systems during shutdown, init issues SIGTERM to all processes that are not essential to powering off, waits a few seconds, and then issues SIGKILL to forcibly terminate other processes to allow the computer to halt.
|
linux kill信號(hào)列表
2009-04-13 17:00
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 17) SIGCHLD
18) SIGCONT 19) SIGSTOP 20) SIGTSTP 21) SIGTTIN
22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO
30) SIGPWR 31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1
36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 39) SIGRTMIN+5
40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 59) SIGRTMAX-5
60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 63) SIGRTMAX-1
64) SIGRTMAX
列表中,編號(hào)為1 ~ 31的信號(hào)為傳統(tǒng)UNIX支持的信號(hào),是不可靠信號(hào)(非實(shí)時(shí)的),編號(hào)為32 ~ 63的信號(hào)是后來擴(kuò)充的,稱做可靠信號(hào)(實(shí)時(shí)信號(hào))。不可靠信號(hào)和可靠信號(hào)的區(qū)別在于前者不支持排隊(duì),可能會(huì)造成信號(hào)丟失,而后者不會(huì)。
下面我們對(duì)編號(hào)小于SIGRTMIN的信號(hào)進(jìn)行討論。
1) SIGHUP
本信號(hào)在用戶終端連接(正常或非正常)結(jié)束時(shí)發(fā)出, 通常是在終端的控制進(jìn)程結(jié)束時(shí), 通知同一session內(nèi)的各個(gè)作業(yè), 這時(shí)它們與控制終端不再關(guān)聯(lián)。
登錄Linux時(shí),系統(tǒng)會(huì)分配給登錄用戶一個(gè)終端(Session)。在這個(gè)終端運(yùn)行的所有程序,包括前臺(tái)進(jìn)程組和后臺(tái)進(jìn)程組,一般都屬于這個(gè) Session。當(dāng)用戶退出Linux登錄時(shí),前臺(tái)進(jìn)程組和后臺(tái)有對(duì)終端輸出的進(jìn)程將會(huì)收到SIGHUP信號(hào)。這個(gè)信號(hào)的默認(rèn)操作為終止進(jìn)程,因此前臺(tái)進(jìn) 程組和后臺(tái)有終端輸出的進(jìn)程就會(huì)中止。不過可以捕獲這個(gè)信號(hào),比如wget能捕獲SIGHUP信號(hào),并忽略它,這樣就算退出了Linux登錄,wget也 能繼續(xù)下載。
此外,對(duì)于與終端脫離關(guān)系的守護(hù)進(jìn)程,這個(gè)信號(hào)用于通知它重新讀取配置文件。
2) SIGINT
程序終止(interrupt)信號(hào), 在用戶鍵入INTR字符(通常是Ctrl-C)時(shí)發(fā)出,用于通知前臺(tái)進(jìn)程組終止進(jìn)程。
3) SIGQUIT
和SIGINT類似, 但由QUIT字符(通常是Ctrl-\)來控制. 進(jìn)程在因收到SIGQUIT退出時(shí)會(huì)產(chǎn)生core文件, 在這個(gè)意義上類似于一個(gè)程序錯(cuò)誤信號(hào)。
4) SIGILL
執(zhí)行了非法指令. 通常是因?yàn)榭蓤?zhí)行文件本身出現(xiàn)錯(cuò)誤, 或者試圖執(zhí)行數(shù)據(jù)段. 堆棧溢出時(shí)也有可能產(chǎn)生這個(gè)信號(hào)。
5) SIGTRAP
由斷點(diǎn)指令或其它trap指令產(chǎn)生. 由debugger使用。
6) SIGABRT
調(diào)用abort函數(shù)生成的信號(hào)。
7) SIGBUS
非法地址, 包括內(nèi)存地址對(duì)齊(alignment)出錯(cuò)。比如訪問一個(gè)四個(gè)字長(zhǎng)的整數(shù), 但其地址不是4的倍數(shù)。它與SIGSEGV的區(qū)別在于后者是由于對(duì)合法存儲(chǔ)地址的非法訪問觸發(fā)的(如訪問不屬于自己存儲(chǔ)空間或只讀存儲(chǔ)空間)。
8) SIGFPE
在發(fā)生致命的算術(shù)運(yùn)算錯(cuò)誤時(shí)發(fā)出. 不僅包括浮點(diǎn)運(yùn)算錯(cuò)誤, 還包括溢出及除數(shù)為0等其它所有的算術(shù)的錯(cuò)誤。
9) SIGKILL
用來立即結(jié)束程序的運(yùn)行. 本信號(hào)不能被阻塞、處理和忽略。如果管理員發(fā)現(xiàn)某個(gè)進(jìn)程終止不了,可嘗試發(fā)送這個(gè)信號(hào)。
10) SIGUSR1
留給用戶使用
11) SIGSEGV
試圖訪問未分配給自己的內(nèi)存, 或試圖往沒有寫權(quán)限的內(nèi)存地址寫數(shù)據(jù).
12) SIGUSR2
留給用戶使用
13) SIGPIPE
管道破裂。這個(gè)信號(hào)通常在進(jìn)程間通信產(chǎn)生,比如采用FIFO(管道)通信的兩個(gè)進(jìn)程,讀管道沒打開或者意外終止就往管道寫,寫進(jìn)程會(huì)收到SIGPIPE信號(hào)。此外用Socket通信的兩個(gè)進(jìn)程,寫進(jìn)程在寫Socket的時(shí)候,讀進(jìn)程已經(jīng)終止。
14) SIGALRM
時(shí)鐘定時(shí)信號(hào), 計(jì)算的是實(shí)際的時(shí)間或時(shí)鐘時(shí)間. alarm函數(shù)使用該信號(hào).
15) SIGTERM
程序結(jié)束(terminate)信號(hào), 與SIGKILL不同的是該信號(hào)可以被阻塞和處理。通常用來要求程序自己正常退出,shell命令kill缺省產(chǎn)生這個(gè)信號(hào)。如果進(jìn)程終止不了,我們才會(huì)嘗試SIGKILL。
17) SIGCHLD
子進(jìn)程結(jié)束時(shí), 父進(jìn)程會(huì)收到這個(gè)信號(hào)。
如果父進(jìn)程沒有處理這個(gè)信號(hào),也沒有等待(wait)子進(jìn)程,子進(jìn)程雖然終止,但是還會(huì)在內(nèi)核進(jìn)程表中占有表項(xiàng),這時(shí)的子進(jìn)程稱為僵尸進(jìn)程。這種情 況我們應(yīng)該避免(父進(jìn)程或者忽略SIGCHILD信號(hào),或者捕捉它,或者wait它派生的子進(jìn)程,或者父進(jìn)程先終止,這時(shí)子進(jìn)程的終止自動(dòng)由init進(jìn)程來接管)。
18) SIGCONT
讓一個(gè)停止(stopped)的進(jìn)程繼續(xù)執(zhí)行. 本信號(hào)不能被阻塞. 可以用一個(gè)handler來讓程序在由stopped狀態(tài)變?yōu)槔^續(xù)執(zhí)行時(shí)完成特定的工作. 例如, 重新顯示提示符...
19) SIGSTOP
停止(stopped)進(jìn)程的執(zhí)行. 注意它和terminate以及interrupt的區(qū)別:該進(jìn)程還未結(jié)束, 只是暫停執(zhí)行. 本信號(hào)不能被阻塞, 處理或忽略.
20) SIGTSTP
停止進(jìn)程的運(yùn)行, 但該信號(hào)可以被處理和忽略. 用戶鍵入SUSP字符時(shí)(通常是Ctrl-Z)發(fā)出這個(gè)信號(hào)
21) SIGTTIN
當(dāng)后臺(tái)作業(yè)要從用戶終端讀數(shù)據(jù)時(shí), 該作業(yè)中的所有進(jìn)程會(huì)收到SIGTTIN信號(hào). 缺省時(shí)這些進(jìn)程會(huì)停止執(zhí)行.
22) SIGTTOU
類似于SIGTTIN, 但在寫終端(或修改終端模式)時(shí)收到.
23) SIGURG
有"緊急"數(shù)據(jù)或out-of-band數(shù)據(jù)到達(dá)socket時(shí)產(chǎn)生.
24) SIGXCPU
超過CPU時(shí)間資源限制. 這個(gè)限制可以由getrlimit/setrlimit來讀取/改變。
25) SIGXFSZ
當(dāng)進(jìn)程企圖擴(kuò)大文件以至于超過文件大小資源限制。
26) SIGVTALRM
虛擬時(shí)鐘信號(hào). 類似于SIGALRM, 但是計(jì)算的是該進(jìn)程占用的CPU時(shí)間.
27) SIGPROF
類似于SIGALRM/SIGVTALRM, 但包括該進(jìn)程用的CPU時(shí)間以及系統(tǒng)調(diào)用的時(shí)間.
28) SIGWINCH
窗口大小改變時(shí)發(fā)出.
29) SIGIO
文件描述符準(zhǔn)備就緒, 可以開始進(jìn)行輸入/輸出操作.
30) SIGPWR
Power failure
31) SIGSYS
非法的系統(tǒng)調(diào)用。
在以上列出的信號(hào)中,程序不可捕獲、阻塞或忽略的信號(hào)有:SIGKILL,SIGSTOP
不能恢復(fù)至默認(rèn)動(dòng)作的信號(hào)有:SIGILL,SIGTRAP
默認(rèn)會(huì)導(dǎo)致進(jìn)程流產(chǎn)的信號(hào)有:SIGABRT,SIGBUS,SIGFPE,SIGILL,SIGIOT,SIGQUIT,SIGSEGV,SIGTRAP,SIGXCPU,SIGXFSZ
默認(rèn)會(huì)導(dǎo)致進(jìn)程退出的信號(hào)有:SIGALRM,SIGHUP,SIGINT,SIGKILL,SIGPIPE,SIGPOLL,SIGPROF,SIGSYS,SIGTERM,SIGUSR1,SIGUSR2,SIGVTALRM
默認(rèn)會(huì)導(dǎo)致進(jìn)程停止的信號(hào)有:SIGSTOP,SIGTSTP,SIGTTIN,SIGTTOU
默認(rèn)進(jìn)程忽略的信號(hào)有:SIGCHLD,SIGPWR,SIGURG,SIGWINCH
此外,SIGIO在SVR4是退出,在4.3BSD中是忽略;SIGCONT在進(jìn)程掛起時(shí)是繼續(xù),否則是忽略,不能被阻塞。
|
會(huì)報(bào)錯(cuò)
sudo: sorry, you must have a tty to run sudo
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
只要用 ssh -t 就可以了。
或者修改 /etc/suoders
將 requirestty 注釋掉
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
1. 使用默認(rèn)隔離級(jí)別 repeatable read
2. 開始,使用 select @@tx_isolation 確認(rèn)當(dāng)前 session 的隔離級(jí)別,并且創(chuàng)建個(gè)表 create table tt (id int, name varchar(300)) engine=innodb
3. 啟動(dòng) transaction 1(t1),使用 start transaction
4. 啟動(dòng) transaction 2(t2), 再開個(gè) mysql,使用 start transaction
5. 在 t2 執(zhí)行 select * from tt
6. 在 t1 執(zhí)行 insert into tt values(1, 'haha')
7. 在 t2 再次執(zhí)行 select * from tt,是看不到數(shù)據(jù)的。
8. 在 t2 執(zhí)行 update tt set name='hehe' where id=1
9. 在 t2 再再次執(zhí)行 select * from tt,居然看到 id=1 那條 hehe 了!
10. 我們幻讀了......
參考自:
http://blog.bitfly.cn/post/mysql-innodb-phantom-read/
原作者寫得非常好
摘要: 轉(zhuǎn)自:http://blog.csdn.net/wang382758656/article/details/5771332
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteed...
閱讀全文
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
因?yàn)檫B接數(shù)的問題,我不得不在一臺(tái)機(jī)器上多啟 mysql instance
1. 建立兩個(gè) mysql 數(shù)據(jù)庫(kù)實(shí)例
mysql_install_db --datadir=xxx
2. 配置 /etc/my.cnf
[client]
#password = your_password
#port = 3306
#socket = /var/lib/mysql/mysql.sock
# Here follows entries for some specific programs
[mysqld_multi]
mysqld = /usr/bin/mysqld_safe
mysqladmin = /usr/bin/mysqladmin
user = mysql
password = mysql
[mysqld1]
datadir = /home/intple/mysql/data1
max_connections = 800
long_query_time = 0.1
#log-queries-not-using-indexes
slow_query_log = 1
slow_query_log_file = /var/log/mysql-slow.log
port = 3306
socket = /home/intple/mysql/data1/mysql.sock
skip-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 32
query_cache_size = 512M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 32
log-bin=mysql-bin
server-id = 1
binlog_format=mixed
innodb_buffer_pool_size = 20G
innodb_additional_mem_pool_size = 32M
innodb_thread_concurrency = 32
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 256M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 1
innodb_autoextend_increment = 64M
innodb_lock_wait_timeout = 200
[mysqld2]
datadir = /home/intple/mysql/data2
max_connections = 800
long_query_time = 0.1
#log-queries-not-using-indexes
slow_query_log = 1
slow_query_log_file = /var/log/mysql2-slow.log
port = 3307
socket = /home/intple/mysql/data2/mysql2.sock
skip-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 32
query_cache_size = 512M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 32
log-bin=mysql-bin
server-id = 1
binlog_format=mixed
innodb_buffer_pool_size = 20G
innodb_additional_mem_pool_size = 32M
innodb_thread_concurrency = 32
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 256M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 1
innodb_autoextend_increment = 64M
innodb_lock_wait_timeout = 200
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
3. 啟動(dòng)
mysqld_multi start 1 &
mysqld_multi start 2 &
應(yīng)該是因?yàn)?ipv6 的原因,我 lsof -i -P | grep xxx , xxx 是那個(gè) udp multicast 的 ip,是可以看到這個(gè)端口被使用了的,但還是一直報(bào)錯(cuò)。 Can't assign requested address
后來查了一下,在啟動(dòng) java 參數(shù)上加上 -Djava.net.preferIPv4Stack=true 就解決了。
轉(zhuǎn)自:http://xok.la/2010/01/mysqlslap_test.html
mysqlslap是官方提供的壓力測(cè)試工具之一,官方介紹如下:
mysqlslap is a diagnostic program designed to emulate client load for a MySQL server and to report
the timing of each stage. It works as if multiple clients are accessing the server. mysqlslap is
available as of MySQL 5.1.4.
下面介紹一些常見參數(shù):
--auto-generate-sql-write-number
每個(gè)線程中產(chǎn)生多少個(gè)insert
--auto-generate-sql-guid-primary
自動(dòng)產(chǎn)生guid格式的主鍵
--number-of-queries=50000
每個(gè)連接客戶端總共發(fā)起的查詢次數(shù)
--concurrency=10,50,100
并發(fā)連接線程數(shù),分別是10、50、100個(gè)并發(fā)
-i, --iterations
重復(fù)執(zhí)行測(cè)試的次數(shù)
--number-char-cols=10
創(chuàng)建測(cè)試表的 char 型字段數(shù)量
--number-int-cols=10
創(chuàng)建測(cè)試表的 int 型字段數(shù)量
下面是一個(gè)完整的例子:
mysqlslap -hlocalhost -uroot --engine=innodb --auto-generate-sql-write-number=100000 \
--auto-generate-sql-guid-primary --concurrency=10,50,100 --number-of-queries=50000 \
--iterations=2 --number-char-cols=10 --number-int-cols=10 --auto-generate-sql \
--create-schema=sbtest --auto-generate-sql-load-type=mixed
具體的慢慢看手冊(cè)吧,mysqlslap在mysql的目錄的bin目錄內(nèi)。
@import url(http://www.aygfsteel.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
按照如下步驟安裝到 DBD::mysql 時(shí),出錯(cuò),提示找不到 mysql_config
perl -MCPAN -eshell
CPAN> install Time::HiRes
CPAN> install Term::ReadKey
CPAN> install DBI
CPAN> install DBD::mysql
需要到 mysql 網(wǎng)站下載
MySQL-devel-community-5.1.57-1.rhel5.x86_64.rpm
安裝,才可以。
我找了半天。
轉(zhuǎn)自:http://dolphin-ygj.iteye.com/blog/366314
vi替換命令用法詳解
: ranges /pat1/pat2/g
其中
: 這是Vi的命令執(zhí)行界面。
range 是命令執(zhí)行范圍的指定: 百分號(hào)(%)表示所有行
點(diǎn)(.)表示當(dāng)前行
美元($)表示最末行
例如:
10,20表示第10到20行,
.,$表示當(dāng)前行到最后一行,.
+2,$-5表示當(dāng)前行后兩行直到全文的倒數(shù)第五行
s 表示其后是一個(gè)替換命令。
pat1 這是要查找的一個(gè)正則表達(dá)式
pat2 這是希望把匹配串變成的模式的正則表達(dá)式
g 可選標(biāo)志,帶這個(gè)標(biāo)志表示替換將針對(duì)行中每個(gè)匹配的串進(jìn)行,否則則只替換行中第一個(gè)匹配串。
:/string #向下查找
:?stirng # 向上查找
1
vi編輯命令責(zé)任編輯:黑色聯(lián)想 更新日期:2006-9-7重復(fù)執(zhí)行命令
數(shù)字N+命令 重復(fù)執(zhí)行命令N次,如刪除15行,就在命令狀態(tài)下輸入15dd
. 重復(fù)執(zhí)行上一條命令
vi命令使用的一些選項(xiàng)及含義
-c sub-command 在對(duì)指定的文件編輯前,先執(zhí)行指定的命令 sub-command .
-r filename 恢復(fù)指定的文件filename .
-R 將指定的文件以只讀的方式放入編輯器中,這樣不會(huì)保存對(duì)文件的任何修 改。
-y number 將編輯窗口的大小設(shè)為number行。
光標(biāo)移動(dòng)
命令模式下,在同一行上移動(dòng)的子命令:
h 將光標(biāo)左移一格
l 將光標(biāo)右移一格
j 將光標(biāo)下移一格
k 將光標(biāo)上移一格
w 將光標(biāo)移到下一個(gè)小字的前面
W 將光標(biāo)移到下一個(gè)大字的前面
b 將光標(biāo)移到前一個(gè)小字的前面
B 將光標(biāo)移到前一個(gè)大字的前面
e 將光標(biāo)移到下一個(gè)小字的后面
E 將光標(biāo)移到前一個(gè)大字的后面
fc 把光標(biāo)移到同一行的下一個(gè)c字符處
Fc 把光標(biāo)移到同一行的前一個(gè)c字符處
tc 把光標(biāo)移到同一行的下一個(gè)字符c的前一格
Tc 把光標(biāo)移到同一行的前一個(gè)字符c的后一格
number|把光標(biāo)移到遞number列上
命令模式下在行間移動(dòng)的子命令:
+或Enter 把光標(biāo)移至下一行第一個(gè)非空白字符
- 把光標(biāo)移至上一行第一個(gè)非空白字符
0 把光標(biāo)移到當(dāng)前行的第一個(gè)字符處
$ 把光標(biāo)移到當(dāng)前行的最后一個(gè)字符處
H 把光標(biāo)移到屏幕最頂端一行
L 把光標(biāo)移到屏幕最底端一行
M 把光標(biāo)移到屏幕中間
:number 光標(biāo)移動(dòng)到第number行
:$ 光標(biāo)移動(dòng)到最后以行
屏幕翻滾類命令
Ctrl+u 向文件首翻半屏
Ctrl+d 向文件尾翻半屏
Ctrl+f 向文件尾翻一屏
Ctrl+b 向文件首翻一屏
nz 將第n行滾至屏幕頂部,不指定n時(shí)將當(dāng)前行滾至屏幕頂部
插入文本
I 在光標(biāo)前
I 在當(dāng)前行首
a 光標(biāo)后
A 在當(dāng)前行尾
o 在當(dāng)前行之下新開一行
O 在當(dāng)前行之上新開一行
r 替換當(dāng)前字符
R 替換當(dāng)前字符及其后的字符,直至按ESC鍵
s 從當(dāng)前光標(biāo)位置處開始,以輸入的文本替代指定數(shù)目的字符
S 刪除指定數(shù)目的行,并以所輸入文本代替之
ncw或nCW 修改n個(gè)單詞
nCC修改指定數(shù)目的行
刪除
x 刪除光標(biāo)所指的一個(gè)字母
X 刪除光標(biāo)左邊的一個(gè)字母
dd 刪除光標(biāo)所在的一行文字,同時(shí)本行文字會(huì)放到緩存中
d0 刪至行首
d$ 刪至行尾
D 刪除本行光標(biāo)右邊的所有文字,包括光標(biāo)位置的字母
d$ 刪除本行光標(biāo)右邊的所有文字,包括光標(biāo)位置的字母
dw 刪除光標(biāo)右邊的一個(gè)單詞
ndw 刪除n個(gè)單詞
d1G 刪除光標(biāo)所在行以上的所有行
dG 刪除光標(biāo)所在行及光標(biāo)以下所有行
復(fù)制
yy 復(fù)制本行文字到緩存中
number yy 復(fù)制number行到緩存中
粘貼
p 把緩存中的行粘貼到光標(biāo)所在的下一行,
P 把緩存中的行粘貼到光標(biāo)所在的上一行
替換
:s/pattern1/pattern2/g 把光標(biāo)當(dāng)前行的pattern1替換為pattern2
:%s/pattern1/pattern2/g 把所有行的pattern1替換為pattern2
:g/parttern1/s//parttern2 把所有行的pattern1替換為pattern2
:num1,num2 s/pattern1/pattern2/g 把num1到num2的partten1替換為partten2
被替換的文字用^表示行首,$表示行尾,如:%s/^/111/g就表示在每一行的行首插入111
文件
:r filename 把文件filename的內(nèi)容粘貼在光標(biāo)以下行
:w 保存當(dāng)前編輯的文件名
:w filename 當(dāng)filename不存在時(shí),把修改后的文件存為文件filename ,當(dāng)文件filename
存在時(shí),報(bào)錯(cuò)。
!w filename 如果文件filename存在時(shí),把修改后的文件保存為文件filename
:q 退出vi ,若文件被修改,系統(tǒng)不會(huì)讓用戶使用q命令退出
q! 不保存退出
x 保存退出
wq 保存退出
在多個(gè)文件之間切換
:n開始編輯vi激活的文件列表中的下一個(gè)文件
:n filenames 指定將被編輯的新的文件列表
在當(dāng)前文件和另外一個(gè)文件間切換:
:e filename 使用filename激活vi(在vi中裝入另一個(gè)文件filename)
e! 重新裝入當(dāng)前文件,若當(dāng)前文件有改動(dòng),則丟棄以前的改動(dòng)
:e+filename 使用filename激活vi ,并從文件尾部開始編輯
:e+number filename 使用filename激活vi ,并在第number行開始編輯
:e# 開始編輯另外一個(gè)文件
查找
/pattern 向后尋找指定的pattern ,若遇到文件尾,則從頭再開始。
?pattern 向前尋找指定的pattern ,若遇到文件頭,則從尾再開始。
n 在上次指定的方向上,再次執(zhí)行上次定義的查找。
N 在上次指定的方向的相反方向上,再次執(zhí)行上次定義的查找。
/pattern/+number 將光標(biāo)停在包含pattern的行后面第number行上。
/pattern/-number 將光標(biāo)停在包含pattern的行前面第number行上。
% 移到匹配的"()"或"{}"上。
選項(xiàng)設(shè)置
all 列出所有選項(xiàng)設(shè)置情況
term 設(shè)置終端類型
ignorance 在搜索中忽略大小寫
list 顯示制表位(Ctrl+I)和行尾標(biāo)志($)
number 顯示行號(hào)
report 顯示由面向行的命令修改過的數(shù)目
terse 顯示簡(jiǎn)短的警告信息
warn 在轉(zhuǎn)到別的文件時(shí)若沒保存當(dāng)前文件則顯示NO write信息
nomagic 允許在搜索模式中,使用前面不帶“\”的特殊字符
nowrapscan 禁止vi在搜索到達(dá)文件兩端時(shí),又從另一端開始
mesg 允許vi顯示其他用戶用write寫到自己終端上的信息
、在vi中使用的查找替換方法
利用 :s 命令可以實(shí)現(xiàn)字符串的替換。具體的用法包括:
:s/str1/str2/ 用字符串 str2 替換行中首次出現(xiàn)的字符串str1
:s/str1/str2/g 用字符串 str2 替換行中所有出現(xiàn)的字符串str1
:.,$ s/str1/str2/g 用字符串 str2 替換正文當(dāng)前行到末尾所有出現(xiàn)的字符串str1
:1,$ s/str1/str2/g 用字符串 str2 替換正文中所有出現(xiàn)的字符串str1
:g/str1/s//str2/g 功能同上從上述替換命令可以看到:g 放在命令末尾,表示對(duì)搜索字符串的每次出現(xiàn)進(jìn)行替換;不加 g,表示只對(duì)搜索字符串的首次出現(xiàn)進(jìn)行替換;g 放在命令開頭,表示對(duì)正文中所有包含搜索字符串的行進(jìn)行替換操作。
2、在shell中使用find結(jié)合grep進(jìn)行文件的替換
# find ./ -exec grep str1 ‘{}’ \; -exec sed -i.bak s/str1/str2/g ‘{}’ \;
上面命令可以在當(dāng)前目錄下(包括子目錄)查找包含str1的文件,自動(dòng)替換成str2,并且生成源文件的bak文件。
準(zhǔn)備寫一個(gè)說不清楚的問題,我表示鴨梨很大。
背景:
1. 業(yè)務(wù)分區(qū),多用戶,用戶間無(wú)交叉
2. 水平切分,一張表存到兩個(gè)庫(kù)里去
Bug:
用戶1引用了用戶2的數(shù)據(jù)(這不算什么,后面一句才重要),平時(shí)看不出來
問題:
第一場(chǎng)
用戶1來了,建了一大堆東西。
用戶2來了,關(guān)聯(lián)了用戶1的東西,因?yàn)槎挤謳?kù)到 s1, s2,所以,相安無(wú)事。
第二場(chǎng)
用戶1來了,又建了一大堆東西。
用戶2來了,又想關(guān)聯(lián)用戶1的數(shù)據(jù)。但是,卻分庫(kù)到 s2, s1,注意順序不一樣,然后,沒關(guān)聯(lián)到,出錯(cuò)了。
我另外發(fā)現(xiàn)了一個(gè)問題,我真無(wú)聊。
目前項(xiàng)目有個(gè)需要,就是在所有查詢的參數(shù)中,增加一個(gè)屬性。
自然想到使用 interceptor 將每個(gè) parameter wraper 一下,加上這個(gè)屬性
我就使用 cglib 生成了一個(gè) wrapper class,然后再 proxy 到原來的 parameter 上。
后來,出了錯(cuò)誤,找了好長(zhǎng)時(shí)間,發(fā)現(xiàn)
ibatis sql 中寫著 isPrimary,可其實(shí)在 java 里是這樣的
private boolean isPrimary;
public boolean isPrimary() {
return isPrimary;
}
其實(shí)屬性名字是 primary 啊,為什么在 wrapper 之前就不出錯(cuò)呢。
找了一下,ibatis 是通過他自己的 probe 來獲得屬性值的,這個(gè) probe 不僅會(huì)通過方法取值,還會(huì)通過 field name 取值,沒訪問權(quán)限的,還會(huì)加上權(quán)限。
就是 ClassInfo 的下面方法
private void addFields(Class clazz) {
Field[] fields = clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
if (canAccessPrivateMethods()) {
try {
field.setAccessible(true);
} catch (Exception e) {
// Ignored. This is only a final precaution, nothing we can do.
}
}
if (field.isAccessible()) {
if (!setMethods.containsKey(field.getName())) {
addSetField(field);
}
if (!getMethods.containsKey(field.getName())) {
addGetField(field);
}
}
}
if (clazz.getSuperclass() != null) {
addFields(clazz.getSuperclass());
}
}
解決辦法,將 isPrimary 改成 primary
也一直使用 quartz,但沒仔細(xì)看過,看了一個(gè)非常詳細(xì)的文章,轉(zhuǎn)發(fā)一下。另外,官方文檔鏈接也附在下面:
轉(zhuǎn)自:
http://wangrui.iteye.com/blog/150947
一個(gè)Cron表達(dá)式是由7個(gè)子表達(dá)式組成的字符串,這些子表達(dá)式用空格分隔,其中最后一個(gè)子表達(dá)式是可選的,其他都是必須的。每個(gè)子表達(dá)式都描述了一個(gè)單獨(dú)的日程細(xì)節(jié)。每一個(gè)子表達(dá)式的含義如下:
子表達(dá)式名稱(取值范圍)(允許的特殊字符)
1.Seconds秒 (0-59) (, - * /)
2.Minutes分鐘 (0-59) (, - * /)
3.Hours小時(shí) (0-23) (, - * /)
4.Day-of-Month月中的天 (1-31) (, - * ? / L W)
5.Month月 (1-12或JAN-DEC) (, - * /)
6.Day-of-Week周中的天 (1-7或SUN-SAT) (, - * ? / L #)
7.Year(optional)年(可選) (空或1970-2099) (, - * /)
一個(gè)cron表達(dá)式的例子字符串為"0 0 12 ? * WED",這表示“每周三的中午12:00”。
單個(gè)子表達(dá)式可以包含范圍或者列表。例如:前面例子中的周中的天這個(gè)域(這里是"WED")可以被替換為"MON-FRI", "MON, WED, FRI"或者甚至"MON-WED,SAT"。
所有的域中的值都有特定的合法范圍,這些值的合法范圍相當(dāng)明顯,例如:秒和分域的合法值為0到59,小時(shí)的合法范圍是0到23,Day-of-Month中值得合法凡范圍是0到31,但是需要注意不同的月份中的天數(shù)不同。月份的合法值是0到11。或者用字符串JAN,FEB MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 及DEC來表示。Days-of-Week可以用1到7來表示(1=星期日)或者用字符串SUN, MON, TUE, WED, THU, FRI 和SAT來表示.
通配符('*')可以被用來表示域中“每個(gè)”可能的值。因此在"Month"域中的*表示每個(gè)月,而在Day-Of-Week域中的*則表示“周中的每一天”。
'?'字符可以用在day-of-month及day-of-week域中,它用來表示“沒有指定值”。這對(duì)于需要指定一個(gè)或者兩個(gè)域的值而不需要對(duì)其他域進(jìn)行設(shè)置來說相當(dāng)有用。
'/'字符用來表示值的增量,例如, 如果分鐘域中放入'0/15',它表示“每隔15分鐘,從0開始”,如果在份中域中使用'3/20',則表示“小時(shí)中每隔20分鐘,從第3分鐘開始”或者另外相同的形式就是'3,23,43'。
'L'字符可以在day-of-month及day-of-week中使用,這個(gè)字符是"last"的簡(jiǎn)寫,但是在兩個(gè)域中的意義不同。例如,在day-of-month域中的"L"表示這個(gè)月的最后一天,即,一月的31日,非閏年的二月的28日。如果它用在day-of-week中,則表示"7"或者"SAT"。但是如果在day-of-week域中,這個(gè)字符跟在別的值后面,則表示"當(dāng)月的最后的周XXX"。例如:"6L" 或者 "FRIL"都表示本月的最后一個(gè)周五。當(dāng)使用'L'選項(xiàng)時(shí),最重要的是不要指定列表或者值范圍,否則會(huì)導(dǎo)致混亂。
'W' 字符用來指定距離給定日最接近的周幾(在day-of-week域中指定)。例如:如果你為day-of-month域指定為"15W",則表示“距離月中15號(hào)最近的周幾”。
'#'表示表示月中的第幾個(gè)周幾。例如:day-of-week域中的"6#3" 或者 "FRI#3"表示“月中第三個(gè)周五”。
1. 在之前的2.x版本下,我一般編譯程序到機(jī)子的做法是修改xproject去掉iPhone Developer的方法,(參考http://www.cocoachina.com/bbs/read.php?tid-1822-fpage-4.html )
如果以前這樣修改過xproject文件的,要先恢復(fù)到原始狀態(tài),把iPhone Developer那句話加回去(隨意找個(gè)2.x時(shí)期的官方sample就有)
2. 制作自己的證書,制作方法參考http://www.weiphone.com/thread-222380-1-1.html ,說明的是,最后的存放位置據(jù)說應(yīng)該是登錄(login)而不是系統(tǒng),反正我現(xiàn)在用的就是登錄.
3. 打開終端,執(zhí)行如下代碼,這個(gè)是XCode的補(bǔ)丁,因?yàn)樵?.13的xcode修補(bǔ)了3.12的免簽名漏洞,打這個(gè)補(bǔ)丁才行
#!/bin/bash
cd /Developer/Platforms/iPhoneOS.platform/Developer/Library/Xcode/Plug-ins/iPhoneOS\ Build\ System\ Support.xcplugin/Contents/MacOS/
dd if=iPhoneOS\ Build\ System\ Support of=working bs=500 count=255
printf "\x8f\x2a\x00\x00" >> working
dd if=iPhoneOS\ Build\ System\ Support of=working bs=1 skip=127504 seek=127504
/bin/mv -n iPhoneOS\ Build\ System\ Support iPhoneOS\ Build\ System\ Support.original
/bin/mv working iPhoneOS\ Build\ System\ Support
chmod a+x iPhoneOS\ Build\ System\ Support
或者你懶的去執(zhí)行,也可以下載這個(gè)文件(要解壓下)
patch.sh.zip (1 K) 下載次數(shù):103 放在用戶根目錄,執(zhí)行
sudo sh ./patch.sh
4. 在終端執(zhí)行如下命令
mkdir /Developer/iphoneentitlements30
cd /Developer/iphoneentitlements30
curl -O http://www.alexwhittemore.com/iphone/gen_entitlements.txt
mv gen_entitlements.txt gen_entitlements.py
chmod 777 gen_entitlements.py
5. XCode中打開你的project,在菜單project->New Build Phase > New Run Script Build Phase,那個(gè)script空白框,拷貝如下代碼進(jìn)去
export CODESIGN_ALLOCATE=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/codesign_allocate
if [ "${PLATFORM_NAME}" == "iphoneos" ]; then
/Developer/iphoneentitlements30/gen_entitlements.py "my.company.${PROJECT_NAME}" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent";
codesign -f -s "iPhone Developer" --resource-rules "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/ResourceRules.plist" \
--entitlements "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/${PROJECT_NAME}.xcent" "${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME}/"
fi
6. 修改"/Developer/Platforms/iPhoneOS.platform/Info.plist"文件,默認(rèn)是用Property List Editor打開,然后添加:
PROVISIONING_PROFILE_ALLOWED = NO
PROVISIONING_PROFILE_REQUIRED = NO
7. 在你的project的info.list里面增加一行,也就是你之前步驟2建的自定義的證書名字啦.
SignerIdentity=iPhone Developer
8. 把你的iphone連接到電腦,提示連接成功,后 xcode菜單,window->Organizer里面,把iphone設(shè)為調(diào)試設(shè)備.
對(duì)了,我忘記了我做的一個(gè)步驟,不知道是不是必須的,這里補(bǔ)上
9. iphone要安裝MobileInstallation Patch ,安裝步驟:打開cydia,進(jìn)入manage->sources->edit->Add,在網(wǎng)址輸入框里面輸入www.iphone.org.hk/adp/
完成后,進(jìn)入sources 可以看到www.iphone.org.hk 這個(gè)網(wǎng)站,然后進(jìn)去,可以找到MobileInstallation Patch,點(diǎn)擊安裝即可.
安裝完成重啟手機(jī).
轉(zhuǎn)自:http://blog.csdn.net/cafecheng/archive/2009/07/17/4357248.aspx
H2, HSQLDB, DERBY, POSTGRESQL, MYSQL

摘要: 轉(zhuǎn)自:http://www.001pp.com/chengxuyouhua/mysql%20xingnengyouhua2183.html
網(wǎng)上有不少mysql 性能優(yōu)化方案,不過,mysql的優(yōu)化同sql server相比,更為麻煩與負(fù)責(zé),同樣的設(shè)置,在不同的環(huán)境下 ,由于內(nèi)存,訪問量,讀寫頻率,數(shù)據(jù)差異等等情況,可能會(huì)出現(xiàn)不同的結(jié)果,因此簡(jiǎn)單地根據(jù)某個(gè)給出方案來配置mysql是行不通的,...
閱讀全文
轉(zhuǎn)自 http://imysql.cn/node/609
作/譯者:吳炳錫,來源:http://imysql.cn & http://imysql.cn/blog/3208 轉(zhuǎn)載請(qǐng)注明作/譯者和出處,并且不能用于商業(yè)用途,違者必究。
介紹:
InnoDB給MySQL提供了具有提交,回滾和崩潰恢復(fù)能力的事務(wù)安全(ACID兼容)存儲(chǔ)引擎。InnoDB鎖定在行級(jí)并且也在SELECT語(yǔ)句提供一個(gè)Oracle風(fēng)格一致的非鎖定讀。這些特色增加了多用戶部署和性能。沒有在InnoDB中擴(kuò)大鎖定的需要,因?yàn)樵贗nnoDB中行級(jí)鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強(qiáng)制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個(gè)查詢中也可以混合。
Innodb 的創(chuàng)始人:Heikki Tuuri
Heikki Tuuri在Innodb的Bug社區(qū)里也是很活躍的,如果遇到Bug也可以直接提到社區(qū),得到作者的解答。
為什么要學(xué)習(xí)Innodb的調(diào)優(yōu):
目前來說:InnoDB是為Mysql處理巨大數(shù)據(jù)量時(shí)的最大性能設(shè)計(jì)。它的CPU效率可能是任何其它基于磁盤的關(guān)系數(shù)據(jù)庫(kù)引擎所不能匹敵的。在數(shù)據(jù)量大的網(wǎng)站或是應(yīng)用中Innodb是倍受青睞的。
另一方面,在數(shù)據(jù)庫(kù)的復(fù)制操作中Innodb也是能保證master和slave數(shù)據(jù)一致有一定的作用。
參數(shù)調(diào)優(yōu)內(nèi)容:
1. 內(nèi)存利用方面
2. 日值控制方面
3. 文件IO分配,空間占用方面
4. 其它相關(guān)參數(shù)
1.內(nèi)存利用方面:
首先介紹一個(gè)Innodb最重要的參數(shù):
innodb_buffer_pool_size
這個(gè)參數(shù)和MyISAM的key_buffer_size有相似之處,但也是有差別的。這個(gè)參數(shù)主要緩存innodb表的索引,數(shù)據(jù),插入數(shù)據(jù)時(shí)的緩沖。為Innodb加速優(yōu)化首要參數(shù)。
該參數(shù)分配內(nèi)存的原則:這個(gè)參數(shù)默認(rèn)分配只有8M,可以說是非常小的一個(gè)值。如果是一個(gè)專用DB服務(wù)器,那么他可以占到內(nèi)存的70%-80%。這個(gè)參數(shù)不能動(dòng)態(tài)更改,所以分配需多考慮。分配過大,會(huì)使Swap占用過多,致使Mysql的查詢特慢。如果你的數(shù)據(jù)比較小,那么可分配是你的數(shù)據(jù)大小+10%左右做為這個(gè)參數(shù)的值。例如:數(shù)據(jù)大小為50M,那么給這個(gè)值分配innodb_buffer_pool_size=64M
設(shè)置方法:
innodb_buffer_pool_size=4G
這個(gè)參數(shù)分配值的使用情況可以根據(jù)show innodb status\G;中的
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 4668764894;
去確認(rèn)使用情況。
第二個(gè):
innodb_additional_mem_pool:
作用:用來存放Innodb的內(nèi)部目錄
這個(gè)值不用分配太大,系統(tǒng)可以自動(dòng)調(diào)。不用設(shè)置太高。通常比較大數(shù)據(jù)設(shè)置16M夠用了,如果表比較多,可以適當(dāng)?shù)脑龃蟆H绻@個(gè)值自動(dòng)增加,會(huì)在error log有中顯示的。
分配原則:
用show innodb status\G;去查看運(yùn)行中的DB是什么狀態(tài)(參考BUFFER POOL AND MEMORY段中),然后可以調(diào)整到適當(dāng)?shù)闹怠?br />
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 4668764894; in additional pool allocated 16777216
參考:in additional pool allocated 16777216
根據(jù)你的參數(shù)情況,可以適當(dāng)?shù)恼{(diào)整。
設(shè)置方法:
innodb_additional_mem_pool=16M
2.關(guān)于日值方面:
innodb_log_file_size
作用:指定日值的大小
分配原則:幾個(gè)日值成員大小加起來差不多和你的innodb_buffer_pool_size相等。上限為每個(gè)日值上限大小為4G.一般控制在幾個(gè)LOG文件相加大小在2G以內(nèi)為佳。具體情況還需要看你的事務(wù)大小,數(shù)據(jù)大小為依據(jù)。
說明:這個(gè)值分配的大小和數(shù)據(jù)庫(kù)的寫入速度,事務(wù)大小,異常重啟后的恢復(fù)有很大的關(guān)系。
設(shè)置方法:
innodb_log_file_size=256M
innodb_log_files_in_group
作用:指定你有幾個(gè)日值組。
分配原則: 一般我們可以用2-3個(gè)日值組。默認(rèn)為兩個(gè)。
設(shè)置方法:
innodb_log_files_in_group=3
innodb_log_buffer_size:
作用:事務(wù)在內(nèi)存中的緩沖。
分配原則:控制在2-8M.這個(gè)值不用太多的。他里面的內(nèi)存一般一秒鐘寫到磁盤一次。具體寫入方式和你的事務(wù)提交方式有關(guān)。在Oracle等數(shù)據(jù)庫(kù)了解這個(gè),一般最大指定為3M比較合適。
參考:Innodb_os_log_written(show global status 可以拿到)
如果這個(gè)值增長(zhǎng)過快,可以適當(dāng)?shù)脑黾觟nnodb_log_buffer_size
另外如果你需要處理大理的TEXT,或是BLOB字段,可以考慮增加這個(gè)參數(shù)的值。
設(shè)置方法:
innodb_log_buffer_size=3M
innodb_flush_logs_at_trx_commit
作用:控制事務(wù)的提交方式
分配原則:這個(gè)參數(shù)只有3個(gè)值,0,1,2請(qǐng)確認(rèn)一下自已能接受的級(jí)別。默認(rèn)為1,主庫(kù)請(qǐng)不要更改了。
性能更高的可以設(shè)置為0或是2,但會(huì)丟失一秒鐘的事務(wù)。
說明:
這個(gè)參數(shù)的設(shè)置對(duì)Innodb的性能有很大的影響,所以在這里給多說明一下。
當(dāng)這個(gè)值為1時(shí):innodb 的事務(wù)LOG在每次提交后寫入日值文件,并對(duì)日值做刷新到磁盤。這個(gè)可以做到不丟任何一個(gè)事務(wù)。
當(dāng)這個(gè)值為2時(shí):在每個(gè)提交,日志緩沖被寫到文件,但不對(duì)日志文件做到磁盤操作的刷新,在對(duì)日志文件的刷新在值為2的情況也每秒發(fā)生一次。但需要注意的是,由于進(jìn)程調(diào)用方面的問題,并不能保證每秒100%的發(fā)生。從而在性能上是最快的。但操作系統(tǒng)崩潰或掉電才會(huì)刪除最后一秒的事務(wù)。
當(dāng)這個(gè)值為0時(shí):日志緩沖每秒一次地被寫到日志文件,并且對(duì)日志文件做到磁盤操作的刷新,但是在一個(gè)事務(wù)提交不做任何操作。mysqld進(jìn)程的崩潰會(huì)刪除崩潰前最后一秒的事務(wù)。
從以上分析,當(dāng)這個(gè)值不為1時(shí),可以取得較好的性能,但遇到異常會(huì)有損失,所以需要根據(jù)自已的情況去衡量。
設(shè)置方法:
innodb_flush_logs_at_trx_commit=1
3. 文件IO分配,空間占用方面
innodb_file_per_table
作用:使每個(gè)Innodb的表,有自已獨(dú)立的表空間。如刪除文件后可以回收那部分空間。
分配原則:只有使用不使用。但DB還需要有一個(gè)公共的表空間。
設(shè)置方法:
innodb_file_per_table=1
innodb_file_io_threads
作用:文件讀寫IO數(shù),這個(gè)參數(shù)只在Windows上起作用。在LINUX上只會(huì)等于4
設(shè)置方法:
innodb_file_io_threads=4
innodb_open_files
作用:限制Innodb能打開的表的數(shù)據(jù)。
分配原則:如果庫(kù)里的表特別多的情況,請(qǐng)?jiān)黾舆@個(gè)。這個(gè)值默認(rèn)是300。
設(shè)置方法:
innodb_open_files=800
請(qǐng)適當(dāng)?shù)脑黾觮able_cache
4. 其它相關(guān)參數(shù)
這里說明一個(gè)比較重要的參數(shù):
innodb_flush_method
作用:Innodb和系統(tǒng)打交道的一個(gè)IO模型
分配原則:Windows不用設(shè)置。
Unix可以設(shè)置:fsync() or O_SYNC/O_DSYNC
如果系統(tǒng)可以禁止系統(tǒng)的Cache那就把他禁了。
Linux可以選擇:O_DIRECT
直接寫入磁盤,禁止系統(tǒng)Cache了
設(shè)置方法:
innodb_flush_method=O_DIRECT
innodb_max_dirty_pages_pct
作用:控制Innodb的臟頁(yè)在緩沖中在那個(gè)百分比之下,值在范圍1-100,默認(rèn)為90.
這個(gè)參數(shù)的另一個(gè)用處:當(dāng)Innodb的內(nèi)存分配過大,致使Swap占用嚴(yán)重時(shí),可以適當(dāng)?shù)臏p小調(diào)整這個(gè)值,使達(dá)到Swap空間釋放出來。建義:這個(gè)值最大在90%,最小在15%。太大,緩存中每次更新需要致?lián)Q數(shù)據(jù)頁(yè)太多,太小,放的數(shù)據(jù)頁(yè)太小,更新操作太慢。
設(shè)置方法:
innodb_max_dirty_pages_pct=90
動(dòng)態(tài)更改需要有Super權(quán)限:
set global innodb_max_dirty_pages_pct=50;
總結(jié):
這里只算是列出了Innodb部分的重要參數(shù),不能認(rèn)為是對(duì)Mysql的整體調(diào)優(yōu)。Mysql的參數(shù)一般分為:全局參數(shù),具體引擎的參數(shù)。全局參數(shù)方面請(qǐng)參考http://imysql.cn/2007_12_08_optimize_mysql_under_linux yejr的那個(gè)Mysql調(diào)優(yōu)的PPT。
手動(dòng)創(chuàng)建目錄 .ssh 的時(shí)候,權(quán)限可能不對(duì),默認(rèn)應(yīng)該是 775,這樣不行,需要改成 755 或者 700 之類的,才可以。
authorized_keys 文件權(quán)限也要改成 600
順便把步驟寫一下:
1. ssh-keygen 生成 key pair,默認(rèn)是 rsa 的
2. 把 public key 放到服務(wù)器上,然后執(zhí)行
cat xxx >> ~/.ssh/authorized_keys,xxx 是 public key 文件名