linux查看用戶列表php
cat /etc/passwd 能夠查看全部用戶的列表
w 能夠查看當前活躍的用戶列表
cat /etc/group 查看用戶組html
cat /etc/passwd|grep -v nologin|grep -v halt|grep -v shutdown|awk -F":" '{ print $1"|"$3"|"$4 }'|morejava
這樣一來,show出來的就只是用戶列表和一點點東西了~mysql
爲當前用戶建立cron服務linux
1. 鍵入 crontab -e 編輯crontab服務文件git
例如 文件內容以下:程序員
*/2 * * * * /bin/sh /home/admin/jiaoben/buy/deleteFile.sh github
保存文件並並退出web
*/2 * * * * /bin/sh /home/admin/jiaoben/buy/deleteFile.shsql
*/2 * * * * 經過這段字段能夠設定何時執行腳本
/bin/sh /home/admin/jiaoben/buy/deleteFile.sh 這一字段能夠設定你要執行的腳本,這裏要注意一下bin/sh 是指運行 腳本的命令 後面一段時指腳本存放的路徑
2. 查看該用戶下的crontab服務是否建立成功, 用 crontab -l 命令
3. 啓動crontab服務
通常啓動服務用 /sbin/service crond start 如果根用戶的cron服務能夠用 sudo service crond start, 這裏仍是要注意 下 不一樣版本linux系統啓動的服務的命令也不一樣 ,像個人虛擬機裏只需用 sudo service cron restart 便可,如果在根用下直接鍵入service cron start就能啓動服務
4. 查看服務是否已經運行用 ps -ax | grep cron
5. crontab命令
cron服務提供crontab命令來設定cron服務的,如下是這個命令的一些參數與說明:
crontab -u //設定某個用戶的cron服務,通常root用戶在執行這個命令的時候須要此參數
crontab -l //列出某個用戶cron服務的詳細內容
crontab -r //刪除沒個用戶的cron服務
crontab -e //編輯某個用戶的cron服務
好比說root查看本身的cron設置:crontab -u root -l
再例如,root想刪除fred的cron設置:crontab -u fred -r
在編輯cron服務時,編輯的內容有一些格式和約定,輸入:crontab -u root -e
進入vi編輯模式,編輯的內容必定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
任務調度的crond常駐命令
crond 是linux用來按期執行程序的命令。當安裝完成操做系統以後,默認便會啓動此
任務調度命令。crond命令每分鍾會按期檢查是否有要執行的工做,若是有要執行的工
做便會自動執行該工做。
6. crontab命令選項:
-u指定一個用戶
-l列出某個用戶的任務計劃
-r刪除某個用戶的任務
-e編輯某個用戶的任務
7. cron文件語法:
分 小時 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command (取值範圍,0表示週日通常一行對應一個任務)
記住幾個特殊符號的含義:
「*」表明取值範圍內的數字,
「/」表明」每」,
「-」表明從某個數字到某個數字,
「,」分開幾個離散的數字
8. 任務調度設置文件的寫法
可用crontab -e命令來編輯,編輯的是/var/spool/cron下對應用戶的cron文件,也能夠直接修改/etc/crontab文件
具體格式以下:
Minute Hour Day Month Dayofweek command
分鐘 小時 天 月 天每星期 命令
每一個字段表明的含義以下:
Minute 每一個小時的第幾分鐘執行該任務
Hour 天天的第幾個小時執行該任務
Day 每個月的第幾天執行該任務
Month 每一年的第幾個月執行該任務
DayOfWeek 每週的第幾天執行該任務
Command 指定要執行的程序
在這些字段裏,除了「Command」是每次都必須指定的字段之外,其它字段皆爲可選
字段,可視須要決定。對於不指定的字段,要用「*」來填補其位置。
舉例以下:
5 * * * * ls 指定每小時的第5分鐘執行一次ls命令
30 5 * * * ls 指定天天的 5:30 執行ls命令
30 7 8 * * ls 指定每個月8號的7:30分執行ls命令
30 5 8 6 * ls 指定每一年的6月8日5:30執行ls命令
30 6 * * 0 ls 指定每星期日的6:30執行ls命令[注:0表示星期天,1表示星期1,
以此類推,也能夠用英文來表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每個月10號及20號的3:30執行ls命令[注:「,」用來鏈接多個不連續的時段]
25 8-11 * * * ls 天天8-11點的第25分鐘執行ls命令[注:「-」用來鏈接連續的時段]
*/15 * * * * ls 每15分鐘執行一次ls命令 [即每一個小時的第0 15 30 45 60分鐘執行ls命令 ]
30 6 */10 * * ls 每月中,每隔10天6:30執行一次ls命令[即每個月的一、十一、2一、31日是的6:30執行一次ls 命令。 ]
天天7:50以root 身份執行/etc/cron.daily目錄中的全部可執行文件
50 7 * * * root run-parts /etc/cron.daily [ 注:run-parts參數表示,執行後面目錄中的全部可執行文件。 ]
9. 新增調度任務
新增調度任務可用兩種方法:
1)、在命令行輸入: crontab -e 而後添加相應的任務,wq存盤退出。
2)、直接編輯/etc/crontab 文件,即vi /etc/crontab,添加相應的任務。
10. 查看調度任務
crontab -l //列出當前的全部調度任務
crontab -l -u jp //列出用戶jp的全部調度任務
11. 刪除任務調度工做
crontab -r //刪除全部任務調度工做
12. 任務調度執行結果的轉向
例1:天天5:30執行ls命令,並把結果輸出到/jp/test文件中
30 5 * * * ls >/jp/test 2>&1
注:2>&1 表示執行結果及錯誤信息。
編輯/etc/crontab 文件配置cron
cron服務每分鐘不只要讀一次/var/spool/cron內的全部文件,還須要讀一次 /etc/crontab,所以咱們配置這個文件也能運用cron服務作一些事情。用crontab配置是針對某個用戶的,而編輯/etc/crontab是針對系統的任務。此文件的文件格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //若是出現錯誤,或者有數據輸出,數據做爲郵件發給這個賬號
HOME=/ //使用者運行的路徑,這裏是根目錄
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每小時執行
/etc/cron.hourly內的腳本
02 4 * * * root run-parts /etc/cron.daily //天天執行/etc/cron.daily內的腳本
22 4 * * 0 root run-parts /etc/cron.weekly //每星期執行 /etc/cron.weekly內的腳本
42 4 1 * * root run-parts /etc/cron.monthly //每個月去執行/etc/cron.monthly內的腳本
你們注意」run-parts」這個參數了,若是去掉這個參數的話,後面就能夠寫要運行的某個腳本名,而不是文件夾名了
例如:
1) 在命令行輸入: crontab -e 而後添加相應的任務,wq存盤退出。
2)直接編輯/etc/crontab 文件,即vi /etc/crontab,添加相應的任務
11 2 21 10 * rm -rf /mnt/fb
原文地址:http://qa.taobao.com/?p=9189
OpenTSDB用HBase存儲全部的時序(無須採樣)來構建一個分佈式、可伸縮的時間序列數據庫。它支持秒級數據採集全部metrics,支持永久存儲,能夠作容量規劃,並很容易的接入到現有的報警系統裏。OpenTSDB能夠從大規模的集羣(包括集羣中的網絡設備、操做系統、應用程序)中獲取相應的metrics並進行存儲、索引以及服務,從而使得這些數據更容易讓人理解,如web化、圖形化等。
對於運維工程師而言,OpenTSDB能夠獲取基礎設施和服務的實時狀態信息,展現集羣的各類軟硬件錯誤,性能變化以及性能瓶頸。對於管理者而言,OpenTSDB能夠衡量系統的SLA,理解複雜系統間的相互做用,展現資源消耗狀況。集羣的總體做業狀況,能夠用以輔助預算和集羣資源協調。對於開發者而言,OpenTSDB能夠展現集羣的主要性能瓶頸,常常出現的錯誤,從而能夠着力重點解決重要問題。
OpenTSDB使用LGPLv2.1+開源協議,目前版本爲2.X。
OpenTSDB依賴jdk和Gnuplot,Gnuplot須要提早安裝,版本要求爲最小4.2,最大4.4,執行如下命令安裝便可:
1
2
|
yum install gnuplot autoconf
apt-get install gnuplot
|
OpenTSDB是用java編寫的,可是項目構建不是用的java的方式而是使用的C、C++程序員構建項目的方式。運行時依賴:
可選的編譯時依賴:
可選的單元測試依賴:
首先安裝必要依賴:
1
|
yum install gnuplot automake autoconf git -y
|
下載源代碼,能夠指定最新版本或者手動checkout
1
2
3
|
git clone git://github.com/OpenTSDB/opentsdb.git
cd opentsdb
./build.sh
|
COMPRESSION
和HBASE_HOME
,前者設置是否啓用壓縮,或者設置hbase home目錄。若是使用壓縮,則還須要安裝lzosrc/create_table.sh
1
2
3
|
tsdtmp=${TMPDIR-'/tmp'}/tsd # For best performance, make sure
mkdir -p "$tsdtmp" # your temporary directory uses tmpfs
./build/tsdb tsd --port=4242 --staticroot=build/staticroot --cachedir="$tsdtmp" --auto-metric
|
若是你使用的是hbase集羣,則你還須要設置--zkquorum
,--cachedir
對應的目錄會產生一些臨時文件,你能夠設置cron定時任務進行刪除。添加--auto-metric
,則當新的數據被蒐集時自動建立指標。
你能夠將這些參數編寫到配置文件中,而後經過--config
指定該文件所在路徑。
從源代碼安裝gnuplot、autoconf、opentsdb以及tcollector,能夠參考:OpenTSDB & tcollector 安裝部署(Installation and Deployment)
OpenTSDB的配置參數能夠在命令行指定,也能夠在配置文件中指定。配置文件使用的是java的properties文件,文件中key爲小寫,支持逗號鏈接字符串可是不能有空格。全部的OpenTSDB屬性都以tsdb開頭,例如:
1
2
|
# List of Zookeeper hosts that manage the HBase cluster
tsd.storage.hbase.zk_quorum = 192.168.1.100
|
配置參數優先級:
命令行參數 > 配置文件 > 默認值
你能夠在命令行中經過--config
指定配置文件所在路徑,若是沒有指定,OpenTSDB會從如下路徑尋找配置文件:
若是一個合法的配置文件沒有找到而且一些必須參數沒有設置,TSD進程將不會啓動。
配置文件中可配置的屬性請參考:Properties
在深刻理解OpenTSDB以前,須要瞭解一些基本概念。
在OpenTSDB中擁有高基數的指標在查詢過程當中返回的值要多於低基數的指標,這樣花費的時間也就越多。
Compaction。在OpenTSDB中,會將多列合併到一列之中以減小磁盤佔用空間,這和hbase中的Compaction不同。這個過程會在TSD寫數據或者查詢過程當中不按期的發生。
Data Point。每個指標能夠被記錄爲某一個時間點的一個數值。Data Point包括如下部分:
Metric。一個可測量的單位的標稱。metric
不包括一個數值或一個時間,其僅僅是一個標籤,包含數值和時間的叫datapoints
,metric是用逗號鏈接的不容許有空格,例如:
Tags。一個metric應該描述什麼東西被測量,在OpenTSDB中,其不該該定義的太簡單。一般,更好的作法是用Tags來描述具備相同維度的metric。Tags由tagk和tagv組成,前者表示一個分組,後者表示一個特定的項。
Time Series。一個metric的帶有多個tag的data point集合。
Timestamp。一個絕對時間,用來描述一個數值或者一個給定的metric是在何時定義的。
Value。一個Value表示一個metric的實際數值。
UID。在OpenTSDB中,每個metric、tagk或者tagv在建立的時候被分配一個惟一標識叫作UID,他們組合在一塊兒能夠建立一個序列的UID或者TSUID
。在OpenTSDB的存儲中,對於每個metric、tagk或者tagv都存在從0開始的計數器,每來一個新的metric、tagk或者tagv,對應的計數器就會加1。當data point寫到TSD時,UID是自動分配的。你也能夠手動分配UID,前提是auto metric
被設置爲true。默認地,UID被編碼爲3Bytes,每一種UID類型最多能夠有16,777,215個UID。你也能夠修改源代碼改成4Bytes。UID的展現有幾種方式,最多見的方式是經過http api訪問時,3 bytes的UID被編碼爲16進制的字符串。例如,UID爲1的寫爲二進制的形式爲000000000000000000000001
,最爲一個無符號的byte數組,其能夠表示爲[0,0,1]
,編碼爲16進制字符串爲000001
,其中每一位左邊都被補上0,若是其不足兩位。故,UID爲255的會顯示爲[0,0,255]
和0000FF
。
關於爲何使用UID而不使用hashes,能夠參考:why-uids
TSUID。當一個data point被寫到OpenTSDB時,其row key格式爲:<metric_UID><timestamp><tagk1_UID><tagv1_UID>[...<tagkN_UID><tagvN_UID>]
,不考慮時間戳的話,將其他部分都轉換爲UID,而後拼在一塊兒,就能夠組成爲TSUID。
Metadata。主要用於記錄data point的一些附加的信息,方便搜索和跟蹤,分爲UIDMeta和TSMeta。
每個UID都有一個metadata記錄保存在tsdb-uid
表中,每個UID包括一些不可變的字段,如uid
、type
、name
和created
字段表示何時被建立,還能夠有一些額外字段,如description
、notes
、displayName
和一些custom
key/value對,詳細信息,能夠查看 /api/uid/uidmeta
一樣,每個TSUID能夠對應一個TSMeta,記錄在tsdb-uid
中,其包括的字段有tsuid
、metric
、tags
、lastReceived
和created
,可選的字段有description
, notes
,詳細信息,能夠查看/api/uid/tsmeta
開啓Metadata有如下幾個參數:
tsd.core.meta.enable_realtime_uid
tsd.core.meta.enable_tsuid_tracking
tsd.core.meta.enable_tsuid_incrementing
tsd.core.meta.enable_realtime_ts
metadata的另一個形式是Annotations
,詳細說明,請參考annotations
Tree
OpenTSDB使用HBase做爲後端存儲,在安裝OpenTSDB以前,須要先啓動一個hbase節點或者集羣,而後再執行建表語句src/create_table.sh
建立hbase表。建表語句以下:
1
2
3
4
5
6
7
8
9
10
11
12
|
create '$UID_TABLE',
{NAME => 'id', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'},
{NAME => 'name', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'}
create '$TSDB_TABLE',
{NAME => 't', VERSIONS => 1, COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'}
create '$TREE_TABLE',
{NAME => 't', VERSIONS => 1, COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'}
create '$META_TABLE',
{NAME => 'name', COMPRESSION => '$COMPRESSION', BLOOMFILTER => '$BLOOMFILTER'}
|
從上面能夠看出一共建立了4張表,而且能夠設置是否壓縮、是否啓用布隆過濾、保存版本號等等,若是追求hbase讀寫性能,還能夠預建分區。
在OpenTSDB中,全部數據存儲在一張叫作tsdb
的表中,這是爲了充分利用hbase有序和region分佈式的特色。全部的值都保存在列族t
中。
rowkey爲<metric_uid><timestamp><tagk1><tagv1>[...<tagkN><tagvN>]
,UID默認編碼爲3 Bytes,而時間戳會編碼爲4 Bytes
OpenTSDB的tsdb啓動以後,會監控指定的socket端口(默認爲4242),接收到監控數據,包括指標、時間戳、數據、tag標籤,tag標籤包括tag名稱ID和tag值ID。例如:
1
|
myservice.latency.avg 1292148123 42 reqtype=foo host=web42
|
對於指標myservice.latency.avg的ID爲:[0, 0, -69],reqtype標籤名稱的ID爲:[0, 0, 1], foo標籤值的ID爲:[0, 1, 11], 標籤名稱的ID爲:[0, 0, 2] web42標籤值的ID爲:[0, -7, 42],他們組成rowkey:
1
2
3
4
5
|
[0, 0, -69, 77, 4, -99, 32, 0, 0, 1, 0, 1, 11, 0, 0, 2, 0, -7, 42]
`-------' `------------' `-----' `------' `-----' `-------'
metric ID base timestamp name ID value ID name ID value ID
`---------------' `---------------'
first tag second tag
|
row表示格式爲: 每一個數字對應1 byte
NOTE:能夠看到,對於metric + tags相同的數據都會連續存放,且metic相同的數據也會連續存放,這樣對於scan以及作aggregation都很是有幫助
column qualifier 佔用2 bytes或者4 bytes,佔用2 bytes時表示以秒爲單位的偏移,格式爲:
000
表示1個byte,010
表示2byte,011
表示4byte,100
表示8byte佔用4 bytes時表示以毫秒爲單位的偏移,格式爲:
1
或者F
000
表示1個byte,010
表示2byte,011
表示4byte,100
表示8byte舉例:
對於時間戳爲1292148123的數據點來講,其轉換爲以小時爲單位的基準時間(去掉小時後的秒)爲129214800,偏移爲123,轉換爲二進制爲1111011
,由於該值爲整數且長度爲8位(對應爲2byte,故最後3bit爲100
),故其對應的列族名爲:0000011110110100
,將其轉換爲十六進制爲07B4
value 使用8bytes存儲,既能夠存儲long,也能夠存儲double。
總結一下,tsdb
表結構以下:
一個單獨的較小的表叫作tsdb-uid
用來存儲UID映射,包括正向的和反向的。存在兩列族,一列族叫作name
用來將一個UID映射到一個字符串,另外一個列族叫作id
,用來將字符串映射到UID。列族的每一行都至少有如下三列中的一個:
metrics
將metric的名稱映射到UIDtagk
將tag名稱映射到UIDtagv
將tag的值映射到UID若是配置了metadata,則name
列族還能夠包括額外的metatata列。
Row Key - 將會是一個分配到UID的字符串,例如,對於一個指標可能有一個值爲sys.cpu.user
或者對於一個標籤其值可能爲42
Column Qualifiers - 上面三種列類型中一種。
Column Value - 一個無符號的整數,默認被編碼爲3個byte,其值爲UID。
例如如下幾行數據是從tsdb-uid
表中查詢出來的數據,第一個列爲row key,第二列爲"列族:列名",第三列爲值,對應爲UID
1
2
3
|
proc.stat.cpu id:metrics \x00\x00\x01
host id:tagk \x00\x00\x01
cdh1 id:tagv \x00\x00\x01
|
Row Key - 爲UID
Column Qualifiers - 上面三種列類型中一種或者爲metrics_meta
、tagk_meta
、tagv_meta
Column Value - 與UID對應的字符串,對於一個*_meta
列,其值將會是一個UTF-8編碼的JSON格式字符串。不要在OpenTSDB外部去修改該值,其中的字段順序會影響CAS
調用。
例如,如下幾行數據是從tsdb-uid
表中查詢出來的數據,第一個列爲row key,第二列爲"列族:列名",第三列爲值,對應爲UID
1
2
3
4
5
6
|
\x00\x00\x01 name:metrics proc.stat.cpu
\x00\x00\x01 name:tagk host
\x00\x00\x01 name:tagv cdh1
\x00\x00\x01 name:tagk_meta {"uid":"000001","type":"TAGK","name":"host","description":"","notes":"","created":1395213193,"custom":null,"displayName":""}
\x00\x00\x01 name:tagv_meta {"uid":"000001","type":"TAGV","name":"cdh1","description":"","notes":"","created":1395213193,"custom":null,"displayName":""}
\x00\x00\x01 name:metric_meta {"uid":"000001","type":"METRIC","name":"metrics proc.stat.cpu","description":"","notes":"","created":1395213193,"custom":null,"displayName":""}
|
總結一下,tsdb-uid
表結構以下:
上圖對應的一個datapoint以下:
1
|
proc.stat.cpu 1292148123 80 host=cdh1
|
從上圖能夠看出tsdb-uid
的表結構以及數據存儲方式,對於一個data point來講,其被保存到opentsdb以前,會對metrics
、tagk
、tagv
、metric_meta
、tagk_meta
、tagv_meta
生成一個UID(如上圖中的000001
),而後將其插入hbase表中,rowkey爲UID,同時會存儲多行記錄,分別保存metrics
、tagk
、tagv
、metric_meta
、tagk_meta
、tagv_meta
到UID的映射。
這個表是OpenTSDB中不一樣時間序列的一個索引,能夠用來存儲一些額外的信息。這個表名稱叫作tsdb-meta
,該表只有一個列族name
,兩個列,分別爲ts_meta
、ts_ctr
,該表中數據以下:
1
2
3
4
5
|
\x00\x00\x01\x00\x00\x01\x00\x00\x01 name:ts_ctr \x00\x00\x00\x00\x00\x00\x00p
\x00\x00\x01\x00\x00\x01\x00\x00\x01 name:ts_meta {"tsuid":"000001000001000001","displayName":"","description":"","notes":"","created":1395213196,"custom":null,"units":"","dataType":"","retention":0,"max":"NaN","min":"NaN"}
\x00\x00\x02\x00\x00\x01\x00\x00\x01 name:ts_ctr \x00\x00\x00\x00\x00\x00\x00p
\x00\x00\x02\x00\x00\x01\x00\x00\x01 name:ts_meta {"tsuid":"000002000001000001","displayName":"","description":"","notes":"","created":1395213196,"custom":null,"units":"","dataType":"","retention":0,"max":"NaN","min":"NaN"}
|
Row Key 和tsdb
表同樣,其中不包含時間戳,<metric_uid><tagk1><tagv1>[...<tagkN><tagvN>]
TSMeta Column 和UIDMeta類似,其爲UTF-8編碼的JSON格式字符串
ts_ctr Column 計數器,用來記錄一個時間序列中存儲的數據個數,其列名爲ts_ctr
,爲8位有符號的整數。
索引表,用於展現樹狀結構的,相似於文件系統,以方便其餘系統使用,例如:Graphite
tsdb支持如下參數:
1
2
3
|
[root@cdh1 build]# ./tsdb
usage: tsdb <command> [args]
Valid commands: fsck, import, mkmetric, query, tsd, scan, uid
|
經過如下命令建立指標:
1
|
./tsdb mkmetric mysql.bytes_received mysql.bytes_sent
|
執行上述命令的結果以下:
1
2
|
metrics mysql.bytes_received: [0, 0, -93]
metrics mysql.bytes_sent: [0, 0, -92]
|
KairosDB是一個快速可靠的分佈式時間序列數據庫,主要用於Cassandra固然也能夠適用與HBase。KairosDB是在OpenTSDB基礎上重寫的,他不只能夠在HBase上存儲數據還支持Cassandra。
KairosDB主頁:https://code.google.com/p/kairosdb/
轉自:http://blog.javachen.com/2014/01/22/all-things-opentsdb/#
命令 lsof -i tcp:port (port替換成端口號,好比6379)能夠查看該端口被什麼程序佔用,並顯示PID,方便KILL
使用yy複製一行
使用 行數n+yy 複製n行
使用p對複製的行進行粘貼
使用dd剪切一行
使用 行數n+dd 剪切n行
使用p對剪切的行進行粘貼
在vi中查找某一個單詞,先按Esc,再按 冒號 進入末行模式,輸入/word或者?word查找單詞word,若是想接着查找該單詞,按n或N。
方法1: 按ggdG
方法2: :%d
不管是開發者是運維人員,都常常有須要進入容器的訴求。
目前看,主要的方法不外乎如下幾種:
1. 使用ssh登錄進容器
2. 使用nsenter、nsinit等第三方工具
3. 使用docker自己提供的工具
方法1須要在容器中啓動sshd,存在開銷和攻擊面增大的問題。同時也違反了Docker所倡導
的一個容器一個進程的原則。
方法2須要額外學習使用第三方工具。
因此大多數狀況最好仍是使用Docker原生方法,Docker目前主要提供了Docker exec和
Docker attach兩個命令。
如下在fedora21,docker1.7上驗證。
Docker attach能夠attach到一個已經運行的容器的stdin,而後進行命令執行的動做。
可是須要注意的是,若是從這個stdin中exit,會致使容器的中止。
[root@localhost temp]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2327e7eab0ed busybox:buildroot-2014.02 "/bin/sh" About a minute ago Up About a minute bb2 [root@localhost temp]# docker attach bb2 / # ls bin dev etc home lib lib64 linuxrc media mnt opt proc root run sbin sys tmp usr var / # pwd / / #
能夠看出只用-i時,因爲沒有分配僞終端,看起來像pipe執行同樣。可是執行結果、命令
返回值均可以正確獲取。
[root@localhost temp]# docker exec -i bb2 /bin/sh date Tue Jul 14 04:01:11 UTC 2015 echo $? 0 dir /bin/sh: dir: not found echo $? 127
使用-it時,則和咱們日常操做console界面相似。並且也不會像attach方式由於退出,致使
整個容器退出。
這種方式能夠替代ssh或者nsenter、nsinit方式,在容器內進行操做。
[root@localhost temp]# docker exec -it bb2 /bin/sh / # pwd / / # echo $? 0 / # dir /bin/sh: dir: not found / # echo $? 127
若是隻使用-t參數,則能夠看到一個console窗口,可是執行命令會發現因爲沒有得到stdin
的輸出,沒法看到命令執行狀況。
[root@localhost temp]# docker exec -t bb2 /bin/sh / # pwd hanging.... [root@localhost temp]# docker exec -t bb2 pwd / [root@localhost temp]# echo $? 0 [root@localhost temp]# docker exec -t bb2 dir 2015/07/14 04:03:57 docker-exec: failed to exec: exec: "dir": executable file not found in $PATH [root@localhost temp]# echo $? 0
docker exec執行後,會命令執行返回值。(備註Docker1.3彷佛有Bug,不能正確返回命令執行結果)
[root@localhost temp]# docker exec -it bb cat /a.sh echo "running a.sh" exit 10 [root@localhost temp]# docker exec -t bb /a.sh running a.sh [root@localhost temp]# echo $? 10 [root@localhost temp]# docker exec -it bb /a.sh running a.sh [root@localhost temp]# echo $? 10 [root@localhost temp]# docker exec -i bb /a.sh running a.sh [root@localhost temp]# echo $? 10
在後臺執行一個進程。能夠看出,若是一個命令須要長時間進程,使用-d參數會很快返回。
程序在後臺運行。
[root@localhost temp]# docker exec -d bb2 /a.sh [root@localhost temp]# echo $? 0
若是不使用-d參數,因爲命令須要長時間執行,docker exec會卡住,一直等命令執行完成
才返回。
[root@localhost temp]# docker exec bb2 /a.sh ^C[root@localhost temp]# [root@localhost temp]# [root@localhost temp]# docker exec -it bb2 /a.sh ^C[root@localhost temp]# [root@localhost temp]# docker exec -i bb2 /a.sh ^C[root@localhost temp]# docker exec -t bb2 /a.sh ^C[root@localhost temp]#
在平常管理項目的過程當中,可能會遇到提交的 commit/merge 並非想要的,或是操做失誤提交了,那麼此時咱們須要把不想要的 commit/merge 取消掉,若是作到呢?Git 爲咱們提供了一個 reset
command,很好地解決了這個問題。
$ git reset [--hard|soft|mixed|merge|keep] [<commit>|<HEAD>]
經常使用的是[--hard|soft|mixed]
,本文主要使用--hard
做爲例子進行說明。
在本地倉庫執行 $ git reset --hard HEAD^
能夠將本地的倉庫回滾到上一次提交時的狀態,HEAD^
指的是上一次提交。
同時你也能夠執行 $ git reset --hard fc232ae
將其回滾到 fc232ae
commit 時的狀態。
以上操做只會對本地倉庫形成影響,而遠程倉庫的源碼和 commit 信息並不會所以改變。那麼此時咱們須要另一個 command 來改變遠程倉庫的狀態。
注意,此時不要在上一步的操做以後執行$ git pull
,由於這個操做會使本地倉庫的狀態與遠程同步。
$ git push origin [branch] -f
執行此命令後,Git 會將遠程倉庫的狀態與本地倉庫的保持一致,即回滾狀態。
在更新代碼時,不免一次到位,此時就會生成許許多多的 commit 。好比同一個文件,反覆地修改代碼,反覆地提交,此時會有5,6個 commit 甚至更多,那麼你會在提交 list 中看到一大串的 commit 記錄,會以爲非常頭疼,雜亂。此時咱們須要把這些 commit 整合如下,合併到一個 commit 中,其餘的 commit 都 squash 到第一 commit 中,那麼就須要用到 rebase
。
$ git rebase -i [branch|<commit>]
你能夠直接進入某個分支的 rebase 也能夠進入某次 commit 的 rebase,若是你是項將某些 commit 合併,那麼建議使用 $ git rebase -i <commit>
。
此外 rebase 還提供三個操做命令,分別是 --continue
、--absort
和 --skip
,這三個命令的意思分別是「繼續」、「退出」和「跳過」。
$ git log
執行此命令便可看到當前分支下全部的提交記錄,而後根據我的須要複製其中的 commit 的 SHA 進行 rebase 操做。
執行:
$ git rebase -i 9cbc329
而後就會看到:
pick fb554f5 This is commit 1 pick 2bd1903 This is commit 2 pick d987ebf This is commit 3 # Rebase 9cbc329..d987ebf onto 9cbc329 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #
那麼其中 pick fb554f5 This is commit 1
咱們能夠把它分紅三部分去解釋:
pick
::操做,即 rebase commandfb554f5
:commit shortID,提交的簡寫IDThis is commit 1
: commit message,提交時填寫的提交信息此時咱們能夠看到輸出結果中所提供的一些操做方法,好比 pick
、squash
、edit
等。那麼重要的是 pick
和 squash
。
接着咱們須要把 2bd1903
和 d987ebf
合併到 fb554f5
中,作以下操做(注意:此時是 VIM 的操做界面,熟悉 Linux 的同窗能夠無視,不熟悉的能夠簡略的指導):
pick fb554f5 This is commit 1 squash 2bd1903 This is commit 2 squash d987ebf This is commit 3 # Rebase 9cbc329..d987ebf onto 9cbc329 # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # If you remove a line here THAT COMMIT WILL BE LOST. # However, if you remove everything, the rebase will be aborted. #
在作完以上修改操做後輸入 :x
保存文件並退出界面,而後就會看到:
$ git rebase -i 9cbc329
rebase in progress; onto 9cbc329
You are currently rebasing branch 'master' on '9cbc329'.
nothing to commit, working directory clean The previous cherry-pick is now empty, possibly due to conflict resolution. If you wish to commit it anyway, use: git commit --allow-empty Otherwise, please use 'git reset' Could not apply 9cbc329f722f8e531496da70ee3857b031574b6d... squash commit on rebase
此時用 $ git status
查看會看到:
$ git status
rebase in progress; onto 9cbc329 You are currently rebasing branch 'master' on '9cbc329'. (all conflicts fixed: run "git rebase --continue") nothing to commit, working directory clean
緊接着咱們須要執行 $ git rebase --continue
操做:
$ git rebase --continue [detached HEAD 2bd1903...d987ebf] squash commit on rebase Date: Tue Nov 3 10:09:43 2015 +0800 1 file changed, 149 insertions(+), 154 deletions(-) rewrite test.js (72%) Successfully rebased and updated refs/heads/master.
最後咱們須要把修改合併好的 commit push 到遠程倉庫上:
$ git push origin [branch] -f
到此爲止,整個 rebase 操做都已完成。
你會看到相似:
變成相似:
在 VIM 的操做界面下,須要按 I/Insert
鍵進行插入修改文本操做,修改完文本以後須要按 Esc
鍵退出編輯狀態,而後輸入 :q
是離開,輸入 :!q
是強制離開,輸入 :x
是保存修改並離開。
在 rebase 修改文本結束後須要輸入 :x
進行保存。
nc -z 192.168.1.103 22; echo $?