導航:首頁 > 操作系統 > attachlinux

attachlinux

發布時間:2023-08-05 10:08:32

1. linux進程後台運行的幾種方式

Ctrl+z/bg/nohup/setsid/&
在Linux中,如果要讓進程在後台運行,一般情況下,我們在命令後面加上&即可,實際上,這樣是將命令放入到一個作業隊列中了:

./rsync.sh &# jobs

但是如上方到後台執行的進程,其父進程還是當前終端shell的進程,而一旦父進程退出,則會發送hangup信號給所有子進程,子進程收到hangup以後也會退出。如果我們要在退出shell的時候繼續運行進程,則需要使用nohup忽略hangup信號,或者setsid將將父進程設為init進程(進程號為1):對於已經在前台執行的命令,也可以重新放到後台執行,首先按ctrl+z暫停已經運行的進程,然後使用bg命令將停止的作業放到後台運行:bg %1,放回前台運行:%1。
# nohup ./rsync.sh &# setsid ./rsync.sh &或
# (./rsync.sh &) ////在一個subshell中執行# ps -ef|grep rsync

nohup 的用途就是讓提交的命令忽略 hangup 信號,標准輸出和標准錯誤預設會被重定向到 nohup.out 文件中。。一般我們可在結尾加上」&」來將命令同時放入後台運行,也可用」 > log.out 2>&1」來更改預設的重定向文件名。
上面的試驗演示了使用nohup/setsid加上&使進程在後台運行,同時不受當前shell退出的影響。那麼對於已經在後台運行的進程,該怎麼辦呢?可以使用disown命令:
# jobs
# disown -h %1# ps -ef|grep rsync

效果與setid相同,但是disown後無法通過jobs命令查看了。
screen
還有一種更加強大的方式是使用screen,首先創建一個斷開模式的虛擬終端,然後用-r選項重新連接這個虛擬終端,在其中執行的任何命令,都能達到nohup的效果,這在有多個命令需要在後台連續執行的時候比較方便。

GNU Screen是一款由GNU計劃開發的用於命令行終端切換的自由軟體。用戶可以通過該軟體同時連接多個本地或遠程的命令行會話,並在其間自由切換,可以看作是窗口管理器的命令行界面版本。它提供了統一的管理多個會話的界面和相應的功能。
# yum install screen -y

常用screen參數:
# screen -S docker-d 新建一個名叫docker-d的session,並馬上進入
# screen -dmS docker-d 新建一個名叫docker-d的session,但暫不進入,可用於系統啟動腳本里
# screen -ls 列出當前所有session
# screen -r docker-d 恢復到zhouxiao這個session,前提是已經是斷開狀態(-d可以遠程斷開會話)
# screen -x docker-d 連接到離線模式的會話(多窗口同步演示)
# screen ./rsync.sh screen創建一個執行腳本的單窗口會話,可以attach進程ID
# screen -wipe 檢查目前所有的screen作業,並刪除已經無法使用的screen作業

正常情況下,當你退出一個窗口中最後一個程序(通常是bash)後,這個窗口就關閉了。另一個關閉窗口的方法是使用C-a k,這個快捷鍵殺死當前的窗口,同時也將殺死這個窗口中正在運行的進程。
在每個screen session 下,所有命令都以 ctrl+a(C-a) 開始。
C-a w 顯示所有窗口列表
C-a k 這個快捷鍵殺死當前的窗口,同時也將殺死這個窗口中正在運行的進程。
C-a d detach,暫時離開當前session

上面只是基本也是最常用的用法,更多請參考man screen或linux screen 命令詳解。需要了解的是,一個用戶創建的screen,其他用戶(甚至root)通過screen -ls是看不見的。另外,Ctrl+a在bash下是用來回到行開頭,不幸與上面的組合快捷鍵沖突。

2. [轉載] 從正在運行的Linux進程中mp出內存內容

最近看到有個CTF題感覺挺有意思,就是從一個bin中找到一個secret key,然後用來簽名session cookies用來懟一個使用go的Web伺服器。通常這種類型題的flag都比較直接。可以直接用strings懟這個bin就可以了,然而這次的這個題目中的bin不同,因為有太多雜碎(noise)要過濾了。於是在此我就來展示一下如何用一些基本的Linux命令配合gdb從進程中mp出內存中的信息。
先file一下,

發現是64位的Linux可執行文件。
然後strings一下,

發現字元串太多,還是先不看,再研究深一點吧。
然後先運行一下程序,

然後再另一個終端找到這個進程的PID

然後cat一下它的內存(太長不看TL;DR)

似乎太多了有點可怕,但是不用害怕。
然後啟動gdb,將改進程attach到gdb上。

然後就是gdb命令

解釋一下語法:

然後就是用strings命令找出剛才mp出的文件的字元串,我喜歡最少10個長度的字元串(-n 10)來過濾掉一些無用的信息(noise)。
結果如下:

可以看到好像有個hash值,為了不泄露CTF題的答案,我已經把hash值改了。

總結
好了,你已經找到運行的進程的PID,mp出了那個進程的內存內容,然後用gdb,strings命令找出了有用的數據。

以上翻譯自:
https://colin.guru/index.php?title=Dumping_Ram_From_Running_Linux_Processes

Let』s get your hands dirty
Down to business
於是我也想試一下啊,然而我想找一個執行命令之後不退出的進程還蠻難的,最終我想到了apache,然而必須要有客戶端與apache建立TCP長連接,如果是那種5xx的錯誤,比如這個,
就會發現TCP連接建立之後馬上又斷開了。

於是只能弄一個TCP長連接吧。返回200的那種應該可以。
結果發現還是不行。
於是通過htop漫無目的地找吧,於是還是找apache的主進程吧。
通過htop發信apache的主進程的PID為6900,
於是

(注意:要以root的身份啟動,否則可能沒有許可權。)
然後gdb就開始調試6900進程了,一頓輸出啊,幾秒之後到達gdb的命令行。
然後mp出heap中的內容。

然後在/root目錄找到了那兩個mp出來的文件,

從任意一個mp中找出10個字元以上的字元串吧。

————————————————

原文鏈接: https://blog.csdn.net/caiqiiqi/article/details/72807952

3. 如何使用linux的Documentation來寫驅動

Linux I2C驅動是嵌入式Linux驅動開發人員經常需要編寫的一種驅動,因為凡是系統中使用到的I2C設備,幾乎都需要編寫相應的I2C驅動去配置和控制它,例如 RTC實時時鍾晶元、音視頻採集晶元、音視頻輸出晶元、EEROM晶元、AD/DA轉換晶元等等。
Linux I2C驅動涉及的知識點還是挺多的,主要分為Linux I2C的匯流排驅動(I2C BUS Driver)和設備驅動(I2C Clients Driver),本文主要關注如何快速地完成一個具體的I2C設備驅動(I2C Clients Driver)。關於Linux I2C驅動的整體架構、核心原理等可以在網上搜索其他相關文章學習。
本文主要參考了Linux內核源碼目錄下的 ./Documentation/i2c/writing-clients 文檔。以手頭的一款視頻採集晶元TVP5158為驅動目標,編寫Linux I2C設備驅動。
1. i2c_driver結構體對象
每一個I2C設備驅動,必須首先創造一個i2c_driver結構體對象,該結構體包含了I2C設備探測和注銷的一些基本方法和信息,示例如下:
static struct i2c_driver tvp5158_i2c_driver = { .driver = { .name = "tvp5158_i2c_driver", }, .attach_adapter = &tvp5158_attach_adapter, .detach_client = &tvp5158_detach_client, .command = NULL, };

其中,name欄位標識本驅動的名稱(不要超過31個字元),attach_adapter和detach_client欄位為函數指針,這兩個函數在I2C設備注冊的時候會自動調用,需要自己實現這兩個函數,後面將詳細講述。
2. i2c_client 結構體對象
上面定義的i2c_driver對象,抽象為一個i2c的驅動模型,提供對i2C設備的探測和注銷方法,而i2c_client結構體則是代表著一個具體的i2c設備,該結構體有一個data指針,可以指向任何私有的設備數據,在復雜點的驅動中可能會用到。示例如下:
struct tvp5158_obj{ struct i2c_client client; int users; // how many users using the driver }; struct tvp5158_obj* g_tvp5158_obj;

其中,users為示例,用戶可以自己在tvp5158_obj這個結構體裡面添加感興趣的欄位,但是i2c_client欄位不可少。具體用法後面再詳細講。
3. 設備注冊及探測功能
這一步很關鍵,按照標準的要求來寫,則Linux系統會自動調用相關的代碼去探測你的I2C設備,並且添加到系統的I2C設備列表中以供後面訪問。
我們知道,每一個I2C設備晶元,都通過硬體連接設定好了該設備的I2C設備地址。因此,I2C設備的探測一般是靠設備地址來完成的。那麼,首先要在驅動代碼中聲明你要探測的I2C設備地址列表,以及一個宏。示例如下:
static unsigned short normal_i2c[] = { 0xbc >> 1, 0xbe >> 1, I2C_CLIENT_END }; I2C_CLIENT_INSMOD;

normal_i2c 數組包含了你需要探測的I2C設備地址列表,並且必須以I2C_CLIENT_END作為結尾,注意,上述代碼中的0xbc和0xbe是我在硬體上為我的tvp5158分配的地址,硬體上我支持通過跳線將該地址設置為 0xbc 或者 0xbe,所以把這兩個地址均寫入到探測列表中,讓系統進行探測。如果你的I2C設備的地址是固定的,那麼,這里可以只寫你自己的I2C設備地址,注意必須向右移位1。
宏 I2C_CLIENT_INSMOD 的作用網上有許多文章進行了詳細的講解,這里我就不詳細描述了,記得加上就行,我們重點關注實現。
下一步就應該編寫第1步中的兩個回調函數,一個用於注冊設備,一個用於注銷設備。探測函數示例如下:
static int tvp5158_attach_adapter(struct i2c_adapter *adapter) { return i2c_probe(adapter, &addr_data, &tvp5158_detect_client); }

這個回調函數系統會自動調用,我們只需要按照上述代碼形式寫好就行,這里調用了系統的I2C設備探測函數,i2c_probe(),第三個參數為具體的設備探測回調函數,系統會在探測設備的時候調用這個函數,需要自己實現。示例如下:
static int tvp5158_detect_client(struct i2c_adapter *adapter,int address,int kind) { struct tvp5158_obj *pObj; int err = 0; printk(KERN_INFO "I2C: tvp5158_detect_client at address %x ...\n", address); if( g_tvp5158_obj != NULL ) { //already allocated,inc user count, and return the allocated handle g_tvp5158_obj->users++; return 0; } /* alloc obj */ pObj = kmalloc(sizeof(struct tvp5158_obj), GFP_KERNEL); if (pObj==0){ return -ENOMEM; } memset(pObj, 0, sizeof(struct tvp5158_obj)); pObj->client.addr = address; pObj->client.adapter = adapter; pObj->client.driver = &tvp5158_i2c_driver; pObj->client.flags = I2C_CLIENT_ALLOW_USE; pObj->users++; /* attach i2c client to sys i2c clients list */ if((err = i2c_attach_client(&pObj->client))){ printk( KERN_ERR "I2C: ERROR: i2c_attach_client fail! address=%x\n",address); return err; } // store the pObj g_tvp5158_obj = pObj; printk( KERN_ERR "I2C: i2c_attach_client ok! address=%x\n",address); return 0; }

到此為止,探測並且注冊設備的代碼已經完成,以後對該 I2C 設備的訪問均可以通過 g_tvp5158_obj 這個全局的指針進行了。

4. linux下怎麼直接使用iic介面

利用Linux中IIC設備子系統移植IIC設備驅動

背景描述

IIC匯流排在嵌入式系統中應用十分廣泛,常見的有eeprom,rtc。一般的處理器會包含IIC的控制器,用來完成IIC時序的控制;另外一方面,由於IIC的時序簡單,使用GPIO口來模擬時序也是常見的做法。面對不同的IIC控制器,各種各樣的晶元以及linux源碼,如何更快做好IIC設備驅動。

問題描述

在我們的方案中,我們會用到eeprom,rtc以及tw2865。由於Hi3520的IIC控制器設計有問題,無法正常使用。而IIC控制器的SDA和SCL管腳正好是和兩個GPIO管腳復用的。Hisi將控制gpio來實現IIC的時序,從而對IIC設備進行操作。這種設計方式簡單明了,但使用IIC子系統,可以更方便的移植和維護其他的設備驅動。

問題分析

Hisi對於gpio口,rtc晶元以及tw2865的處理方式如下:將gpio口做成一個模塊化的驅動,該驅動模擬IIC時序,並向外提供一些函數介面,比如:EXPORT_SYMBOL(gpio_i2c_read_tw2815);等。對於具體的rtc晶元,將其注冊為一個misc設備,並利用gpio模塊導出的函數進行rtc晶元的配置操作。

其實對於linux-2.6.24\drivers\i2c目錄下代碼,我們可以加以利用。

Linux的IIC字結構分為三個組成部分:

IIC核心

IIC核心提供了IIC匯流排驅動和設備驅動的注冊、注銷方法,IICalgorithm上層的、與具體適配器無關的代碼以及探測設備、檢測設備地址的上層代碼。

IIC匯流排驅動

IIC匯流排驅動是對IIC硬體體系結構中適配器端的實現。

IIC設備驅動

IIC設備驅動是對IIC硬體體系總設備端的實現。

我們查看下該目錄下的makefile和kconfig:

obj-$(CONFIG_I2C_BOARDINFO) +=i2c-boardinfo.o

obj-$(CONFIG_I2C) += i2c-core.o

obj-$(CONFIG_I2C_CHARDEV) +=i2c-dev.o

obj-y +=busses/ chips/ algos/

i2c-core.c就是IIC核心,buses中的文件是主流處理器中IIC匯流排的匯流排驅動,而chips中的文件就是常用晶元的驅動,algos中的文件實現了一些匯流排適配器的algorithm,其中就包括我們要用到的i2c-algo-bit.c文件。

我們首先利用i2c-gpio.c和i2c-algo-bit.c做好匯流排驅動。

在i2c-gpio.c中,mole_initi2c_gpio_initplatform_driver_probe(&i2c_gpio_driver,i2c_gpio_probe);

將其注冊為platform虛擬匯流排的驅動。

在staticint __init i2c_gpio_probe(struct platform_device *pdev)中,

定義了如下三個結構體:

structi2c_gpio_platform_data *pdata;//平台相關的gpio的設置

structi2c_algo_bit_data *bit_data;//包含algorithm的具體函數,setor
get SDA和SCL

structi2c_adapter *adap;//適配器

i2c_gpio_probe主要做了下面幾件事:

填充bit_data結構的各個函數指針,關聯到具體的操作SDA和SCl函數。

填充adap結構,adap->algo_data= bit_data;

pdata= pdev->dev.platform_data;

bit_data->data= pdata;

pdev->dev->driver_data= adap;

在i2c-core中注冊適配器類型。

inti2c_bit_add_numbered_bus(struct i2c_adapter *adap)

在staticint i2c_bit_prepare_bus(struct i2c_adapter *adap)中

adap->algo= &i2c_bit_algo;

將i2c_bit_algo與adap關聯上。

static const structi2c_algorithm i2c_bit_algo = {

.master_xfer = bit_xfer,

.functionality = bit_func,

};

其中,master_xfer函數指針就是IIC傳輸函數指針。

I2c-algo-bit.c還實現了IIC開始條件,結束條件的模擬,發送位元組,接收位元組以及應答位的處理。

i2c-gpio.c中的i2c_gpio_setsda_val等函數是與具體平台gpio相關的。

修改對應arch-hi3520v100目錄下的gpio.h中的各個函數,這些函數是通過操作寄存器來控制gpio的方向和值。

在對應mach-hi3520v100中的platform-devices.c中添加如下:

static structi2c_gpio_platform_data pdata = {

.sda_pin = 1<<0,

.sda_is_open_drain = 1,

.scl_pin = 1<<1,

.scl_is_open_drain = 1,

.udelay = 4, /* ~100 kHz */

};

static struct platform_devicehisilicon_i2c_gpio_device = {

.name = "i2c-gpio",

.id = -1,

.dev.platform_data = &pdata,

};

static struct platform_device*hisilicon_plat_devs[] __initdata = {

&hisilicon_i2c_gpio_device,

};

int __inithisilicon_register_platform_devices(void)

{

platform_add_devices(hisilicon_plat_devs,ARRAY_SIZE (hisilicon_plat_devs));

return 0;

}

通過platform添加devices和driver,使得pdev->dev.platform_data=pdata

綜合上面的過程,我們完成了adapter的注冊,並將用gpio口模擬的algorithm與adapter完成了關聯。

這樣,在rtc-x1205.c中,x1205_attach函數利用i2c核心完成client和adap的關聯。

在x1205_probe函數中填充i2c_client結構體,並調用i2c_attach_client通知iic核心。

接著注冊rtc驅動。

最後我們要讀取時間,就需要構造i2c_msg結構體,如下所示:

struct i2c_msg msgs[] = {

{ client->addr, 0, 2,dt_addr }, /* setup read ptr */

{ client->addr, I2C_M_RD,8, buf }, /* read date */

};

/* read date registers */

if((i2c_transfer(client->adapter, &msgs[0], 2)) != 2) {

dev_err(&client->dev,"%s: read error\n", __FUNCTION__);

return -EIO;

}

dt_addr是寄存器的地址,I2C_M_RD表示iicread。

5. linux中怎麼使用gdb調試進程有dettach

在2.5.60版Linux內核及以後,GDB對使用fork/vfork創建子進程的程序提供了follow-fork-mode選項來支持多進程調試。 follow-fork-mode的用法為: set follow-fork-mode [parentchild] parent: fork之後繼續調試父進程,子進程不受影響。 child: fork之後調試子進程,父進程不受影響。 因此如果需要調試子進程,在啟動gdb後: (gdb) set follow-fork-mode child並在子進程代碼設置斷點。 此外還有detach-on-fork參數,指示GDB在fork之後是否斷開(detach)某個進程的調試,或者都交由GDB控制: set detach-on-fork [onoff] on: 斷開調試follow-fork-mode指定的進程。 off: gdb將控制父進程和子進程。follow-fork-mode指定的進程將被調試,另一個進程置於暫停(suspended)狀態。 注意,最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。 follow-fork-mode/detach-on-fork的使用還是比較簡單的,但由於其系統內核/gdb版本限制,我們只能在符合要求的系統上才能使用。而且,由於follow-fork-mode的調試必然是從父進程開始的,對於fork多次,以至於出現孫進程或曾孫進程的系統,例如上圖3進程系統,調試起來並不方便。 Attach子進程 眾所周知,GDB有附著(attach)到正在運行的進程的功能,即attach <pid>命令。因此我們可以利用該命令attach到子進程然後進行調試。 例如我們要調試某個進程RIM_Oracle_Agent.9i,首先得到該進程的pid [root@tivf09 tianq]# ps -efgrep RIM_Oracle_Agent.9i nobody 6722 6721 0 05:57 ? 00:00:00 RIM_Oracle_Agent.9i root 7541 27816 0 06:10 pts/3 00:00:00 grep -i rim_oracle_agent.9i通過pstree可以看到,這是一個三進程系統,oserv是RIM_Oracle_prog的父進程,RIM_Oracle_prog又是RIM_Oracle_Agent.9i的父進程。 [root@tivf09 root]# pstree -H 6722通過 pstree 察看進程 啟動GDB,attach到該進程 用 GDB 連接進程 現在就可以調試了。一個新的問題是,子進程一直在運行,attach上去後都不知道運行到哪裡了。有沒有辦法解決呢? 一個辦法是,在要調試的子進程初始代碼中,比如main函數開始處,加入一段特殊代碼,使子進程在某個條件成立時便循環睡眠等待,attach到進程後在該代碼段後設上斷點,再把成立的條件取消,使代碼可以繼續執行下去。 至於這段代碼所採用的條件,看你的偏好了。比如我們可以檢查一個指定的環境變數的值,或者檢查一個特定的文件存不存在。以文件為例,其形式可以如下: void debug_wait(char *tag_file) { while(1) { if (tag_file存在) 睡眠一段時間; else break; } }當attach到進程後,在該段代碼之後設上斷點,再把該文件刪除就OK了。當然你也可以採用其他的條件或形式,只要這個條件可以設置/檢測即可。 Attach進程方法還是很方便的,它能夠應付各種各樣復雜的進程系統,比如孫子/曾孫進程,比如守護進程(daemon process),唯一需要的就是加入一小段代碼。 GDB wrapper 很多時候,父進程 fork 出子進程,子進程會緊接著調用 exec族函數來執行新的代碼。對於這種情況,我們也可以使用gdb wrapper 方法。它的優點是不用添加額外代碼。 其基本原理是以gdb調用待執行代碼作為一個新的整體來被exec函數執行,使得待執行代碼始終處於gdb的控制中,這樣我們自然能夠調試該子進程代碼。 還是上面那個例子,RIM_Oracle_prog fork出子進程後將緊接著執行RIM_Oracle_Agent.9i的二進制代碼文件。我們將該文件重命名為RIM_Oracle_Agent.9i.binary,並新建一個名為RIM_Oracle_Agent.9i的shell腳本文件,其內容如下: [root@tivf09 bin]# mv RIM_Oracle_Agent.9i RIM_Oracle_Agent.9i.binary [root@tivf09 bin]# cat RIM_Oracle_Agent.9i #!/bin/sh gdb RIM_Oracle_Agent.binary當fork的子進程執行名為RIM_Oracle_Agent.9i的文件時,gdb會被首先啟動,使得要調試的代碼處於gdb控制之下。

6. Linux安裝基本命令

Linux安裝基本命令大全

Linux常用命令,你還能記得多少呢?下文是我為大家准備的Linux常用命令,一起來看看吧!

安裝升級

查看軟體xxx安裝內容

dpkg -L xxx

查找軟體庫中的軟體

apt-cache search 正則表達式



aptitude search 軟體包

顯示系統安裝包的統計信息

apt-cache stats

顯示系統全部可用包的名稱

apt-cache pkgnames

顯示包的信息

apt-cache show k3b

查找文件屬於哪個包

dpkg -S filename

apt-file search filename

查看已經安裝了哪些包

dpkg -l

也可用

dpkg -l | less

翻頁查看

查詢軟體xxx依賴哪些包

apt-cache depends xxx

查詢軟體xxx被哪些包依賴

apt-cache rdepends xxx

增加一個光碟源

sudo apt-cdrom add

系統更新

sudo apt-get update (這一步更新包列表)

sudo apt-get dist-upgrade (這一步安裝所有可用更新)

或者

sudo apt-get upgrade (這一步安裝應用程序更新,不安裝新內核等)

清除所有已刪除包的殘餘配置文件

dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

如果報如下錯誤,證明你的系統中沒有殘留配置文件了,無須擔心。

----------------------------------------------------------

dpkg: --purge needs at least one package name argument

Type dpkg --help for help about installing and deinstalling packages [*];

Use `dselect' or `aptitude' for user-friendly package management;

Type dpkg -Dhelp for a list of dpkg debug flag values;

Type dpkg --force-help for a list of forcing options;

Type dpkg-deb --help for help about manipulating *.deb files;

Type dpkg --license for right license and lack of warranty (GNU GPL) [*].

Options marked [*] proce a lot of output - pipe it through `less' or `more' !

----------------------------------------------------------

編譯時缺少h文件的自動處理

sudo auto-apt run ./configure

查看安裝軟體時下載包的臨時存放目錄

ls /var/cache/apt/archives

備份當前系統安裝的所有包的列表

dpkg --get-selections | grep -v deinstall > ~/somefile

從上面備份的安裝包的列表文件恢復所有包

dpkg --set-selections < ~/somefile

sudo dselect

清理舊版本的軟體緩存

sudo apt-get autoclean

清理所有軟體緩存

sudo apt-get clean

刪除系統不再使用的孤立軟體

sudo apt-get autoremove

如果使用

sudo apt-get autoremove --purge

的話會把這些孤立軟體的殘留配置文件也一並移除

查看包在伺服器上面的地址

apt-get -qq --print-uris download 軟體包名稱 | cut -d\' -f2

徹底刪除Gnome

sudo apt-get --purge remove liborbit2

徹底刪除KDE

sudo apt-get --purge remove libqt3-mt libqtcore4

一鍵安裝 LAMP 服務

sudo tasksel install lamp-server

刪除舊內核

sudo aptitude purge ~ilinux-image-.*\(\!\(`uname -r`\|generic-.*\)\)

導入ppa源的'key值

#W: GPG簽名驗證錯誤: http://ppa.launchpad.net jaunty Release: 由於沒有公鑰,下列簽名無法進行驗證: NO_PUBKEY 5126890CDCC7AFE0

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 5126890CDCC7AFE0 #5126890CDCC7AFE0替換為你需要導入的Key值

增加 add-apt-repository 命令

sudo apt-get install software-properties-common

增加一個ppa源

sudo add-apt-repository ppa:user/ppa-name

#使用 ppa 的地址替換 ppa:user/ppa-name

添加163鏡像源

sudo add-apt-repository "deb http://mirrors.163.com/ubuntu/ `lsb_release -cs` main restricted universe multiverse"

sudo add-apt-repository "deb http://mirrors.163.com/ubuntu/ `lsb_release -cs`-updates main restricted universe multiverse"

sudo add-apt-repository "deb http://mirrors.163.com/ubuntu/ `lsb_release -cs`-security main restricted universe multiverse"

系統升級

1 這里指的是版本間的升級,例如 9.04=>10.04。

2 使用該升級方式通常需要使用 backports 源。

sudo apt-get update

sudo apt-get install update-manager-core

sudo do-release-upgrade

系統

查看內核

uname -a

查看系統是32位還是64位

#查看long的位數,返回32或64

getconf LONG_BIT

#查看文件信息,包含32-bit就是32位,包含64-bit就是64位

file /sbin/init

或者使用

uname -m

查看Ubuntu版本

lsb_release -a

或 cat /etc/lsb-release

查看內核載入的模塊

lsmod

查看PCI設備

lspci

查看USB設備

lsusb

#加參數 -v 可以顯示USB設備的描述表(descriptors)

lsusb -v

查看網卡狀態

sudo apt-get install ethtool

sudo ethtool eth0

激活網卡的 Wake-on-LAN

sudo apt-get install wakeonlan

或 sudo ethtool -s eth0 wol g

查看CPU信息

cat /proc/cpuinfo

顯示當前硬體信息

sudo lshw

查看內存型號

sudo dmidecode -t memory

獲取CPU序列號或者主板序列號

#CPU ID

sudo dmidecode -t 4 | grep ID

#Serial Number

sudo dmidecode | grep Serial

#CPU

sudo dmidecode -t 4

#BIOS

sudo dmidecode -t 0

#主板:

sudo dmidecode -t 2

#OEM:

sudo dmidecode -t 11

顯示當前內存大小

free -m |grep "Mem" | awk '{print $2}'

查看硬碟溫度

sudo apt-get install hddtemp

sudo hddtemp /dev/sda

顯示系統運行時間

uptime

查看系統限制

ulimit -a

查看內核限制

ipcs -l

查看當前屏幕解析度

xrandr

硬碟

查看塊設備

lsblk

查看硬碟的分區

sudo fdisk -l

硬碟分區

#危險!小心操作。

sudo fdisk /dev/sda

硬碟格式化

#危險!將第一個分區格式化為 ext3 分區, mkfs.reiserfs mkfs.xfs mkfs.vfat

sudo mkfs.ext3 /dev/sda1

硬碟檢查

#危險!檢查第一個分區,請不要檢查已經掛載的分區,否則容易丟失和損壞數據

sudo fsck /dev/sda1

硬碟壞道檢測

sudo badblocks -s -v -c 32 /dev/sdb

#得到壞的塊後,使用分區工具隔離壞道。

分區掛載

sudo mount -t 文件系統類型 設備路經 訪問路經

#常用文件類型如下: iso9660 光碟機文件系統, vfat fat/fat32分區, ntfs ntfs分區, smbfs windows網路共享目錄, reiserfs、ext3、xfs Linux分區

#如果中文名無法顯示嘗試在最後增加 -o nls=utf8 或 -o iocharset=utf8

#如果需要掛載後,普通用戶也可以使用,在 -o 的參數後面增加 ,umask=022 如:-o nls=utf8,umask=022

分區卸載

sudo umount 目錄名或設備名

只讀掛載ntfs分區

sudo mount -t ntfs -o nls=utf8,umask=0 /dev/sdb1 /mnt/c

可寫掛載ntfs分區

sudo mount -t ntfs-3g -o locale=zh_CN.utf8,umask=0 /dev/sdb1 /mnt/c

掛載fat32分區

sudo mount -t vfat -o iocharset=utf8,umask=0 /dev/sda1 /mnt/c

掛載共享文件

sudo mount -t smbfs -o username=xxx,password=xxx,iocharset=utf8 //192.168.1.1/share /mnt/share

掛載ISO文件

sudo mount -t iso9660 -o loop,utf8 xxx.iso /mnt/iso

查看IDE硬碟信息

sudo hdparm -i /dev/sda

查看軟raid陣列信息

cat /proc/mdstat

參看硬raid陣列信息

dmesg |grep -i raid

cat /proc/scsi/scsi

查看SATA硬碟信息

sudo hdparm -I /dev/sda



sudo apt-get install blktool

sudo blktool /dev/sda id

查看硬碟剩餘空間

df

df --help 顯示幫助

查看目錄佔用空間

-hs 目錄名

閃盤沒法卸載

sync

fuser -km /media/閃盤卷標

使用文件來增加交換空間

#創建一個512M的交換文件 /swapfile

sudo dd if=/dev/zero of=/swapfile bs=1M count=512

sudo mkswap /swapfile

sudo swapon /swapfile

#sudo vim /etc/fstab #加到fstab文件中讓系統引導時自動啟動

/swapfile swap swap defaults 0 0

查看硬碟當前讀寫情況

# 首先安裝 sysstat 包

sudo apt-get install sysstat

#每2秒刷新一次

sudo iostat -x 2

測試硬碟的實際寫入速度

dd if=/dev/zero of=test bs=64k count=512 oflag=dsync

進程

查看當前的內存使用情況

free

連續監視內存使用情況

watch -d free

# 使用 Ctrl + c 退出

動態顯示進程執行情況

top

top指令運行時輸入H或?打開幫助窗口,輸入Q退出指令。

查看當前有哪些進程

ps -AFL

查看進程的啟動時間

ps -A -opid,stime,etime,args

查看目前登入用戶運行的程序

w

查看當前用戶程序實際內存佔用,並排序

ps -u $USER -o pid,rss,cmd --sort -rss

統計程序的內存耗用

ps -eo fname,rss|awk '{arr[$1]+=$2} END {for (i in arr) {print i,arr[i]}}'|sort -k2 -nr

按內存從大到小排列進程

ps -eo "%C : %p : %z : %a"|sort -k5 -nr

列出前十個最耗內存的進程

ps aux | sort -nk +4 | tail

按cpu利用率從大到小排列進程

ps -eo "%C : %p : %z : %a"|sort -nr

ps aux --sort -pcpu |head -n 20

查看當前進程樹

pstree

中止一個進程

kill 進程號(就是ps -A中的第一列的數字)

或者 killall 進程名

強制中止一個進程(在上面進程中止不成功的時候使用)

kill -9 進程號

或者 killall -9 進程名

圖形方式中止一個程序

xkill 出現骷髏標志的滑鼠,點擊需要中止的程序即可

查看進程打開的文件

lsof -p 進程的pid

顯示開啟文件abc.txt的進程

lsof abc.txt

顯示22埠現在運行什麼程序

lsof -i :22

顯示nsd進程現在打開的文件

lsof -c nsd

在後台運行程序,退出登錄後,並不結束程序

nohup 程序 &

#查看中間運行情況tail nohup

在後台運行互動式程序,退出登錄後,並不結束程序

sudo apt-get install screen

screen vim a.txt

#直接退出後使用

screen -ls # 2208pxs-0.ubuntu (Detached)

screen -r 1656 #恢復

#熱鍵,同時按下Ctrl和a鍵結束後,再按下功能鍵

C-a ? #顯示所有鍵綁定信息

C-a w #顯示所有窗口列表

C-a C-a #切換到之前顯示的窗口

C-a c #創建一個新的運行shell的窗口並切換到該窗口

C-a n #切換到下一個窗口

C-a p #切換到前一個窗口(與C-a n相對)

C-a 0..9 #切換到窗口0..9

C-a a #發送 C-a到當前窗口

C-a d #暫時斷開screen會話

C-a k #殺掉當前窗口

在後台運行互動式程序,退出登錄後,並不結束程序

tmux 進入後再運行其它命令

tmux attach #恢復

#熱鍵,同時按下Ctrl和b鍵結束後,再按下功能鍵

C-b c #創建一個新的運行shell的窗口並切換到該窗口

C-b n #切換到下一個窗口

C-b p #切換到前一個窗口(與C-a n相對)

C-b 0..9 #切換到窗口0..9

C-b d #暫時斷開會話

C-b & #殺掉當前窗口

詳細顯示程序的運行信息

strace -f -F -o outfile

增加系統最大打開文件個數

#ulimit -SHn

sudo vim /etc/security/limits.conf

文件尾追加

* hard nofile 4096

* soft nofile 4096

sudo vim /etc/pam.d/su

將 pam_limits.so 這一行注釋去掉

重起系統

清除僵屍進程

ps -eal | awk '{ if ($2 == "Z") {print $4}}' | xargs sudo kill -9

將大於120M內存的php-cgi都殺掉

ps -eo pid,fname,rss|grep php-cgi|grep -v grep|awk '{if($3>=120000) print $1}' | xargs sudo kill -9

Linux系統中如何限制用戶進程CPU佔用率

renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > 500) print $2}'`

#或直接編輯/etc/security/limits.conf文件。 ;

閱讀全文

與attachlinux相關的資料

熱點內容
如何讓軟體在多個安卓系統上運行 瀏覽:571
java判斷半形 瀏覽:880
java判斷正負 瀏覽:320
刷頭條程序員的日常 瀏覽:102
吉林程序員吐槽 瀏覽:243
單片機溫度范圍 瀏覽:419
程序員為什麼素質低 瀏覽:897
可愛的程序員小姐姐 瀏覽:145
伺服器上網站的地址 瀏覽:798
蘋果平板如何找到app資源庫 瀏覽:321
阿里雲可以雲伺服器地址 瀏覽:249
熊貓繪畫app如何導入圖片 瀏覽:555
如何自己編輯手機app 瀏覽:924
程序員那麼可愛帶的項鏈 瀏覽:532
安卓系統導航mic什麼意思 瀏覽:192
編譯sdk如何輸出bin文件 瀏覽:677
如何用html5開發app 瀏覽:142
怎麼隱藏蘋果的app 瀏覽:327
上海捷豹空氣壓縮機 瀏覽:457
51單片機換行 瀏覽:739