『壹』 android shell command有哪些
Android執行shell命令
一、方法
1. /**
2. * 執行一個shell命令,並返回字元串值
3. *
4. * @param cmd
5. * 命令名稱&參數組成的數組(例如:{"/system/bin/cat", "/proc/version"})
6. * @param workdirectory
7. * 命令執行路徑(例如:"system/bin/")
8. * @return 執行結果組成的字元串
9. * @throws IOException
10. */
11. public static synchronized String run(String[] cmd, String workdirectory)
12. throws IOException {
13. StringBuffer result = new StringBuffer();
14. try {
15. // 創建操作系統進程(也可以由Runtime.exec()啟動)
16. // Runtime runtime = Runtime.getRuntime();
17. // Process proc = runtime.exec(cmd);
18. // InputStream inputstream = proc.getInputStream();
19. ProcessBuilder builder = new ProcessBuilder(cmd);
20.
21. InputStream in = null;
22. // 設置一個路徑(絕對路徑了就不一定需要)
23. if (workdirectory != null) {
24. // 設置工作目錄(同上)
25. builder.directory(new File(workdirectory));
26. // 合並標准錯誤和標准輸出
27. builder.redirectErrorStream(true);
28. // 啟動一個新進程
29. Process process = builder.start();
30.
31. // 讀取進程標准輸出流
32. in = process.getInputStream();
33. byte[] re = new byte[1024];
34. while (in.read(re) != -1) {
35. result = result.append(new String(re));
36. }
37. }
38. // 關閉輸入流
39. if (in != null) {
40. in.close();
41. }
42. } catch (Exception ex) {
43. ex.printStackTrace();
44. }
45. return result.toString();
46. }
二、用途
執行Linux下的top、ps等命令,這些命令你也通過adb可以執行查看效果。
1)top命令如下:
1. adb shell
2. $ top -h
3. top -h
4. Usage: top [-m max_procs] [-n iterations] [-d delay] [-s sort_column] [-t] [-h]
5. -m num Maximum number of processes to display. // 最多顯示多少個進程
6. -n num Updates to show before exiting. // 刷新次數
7. -d num Seconds to wait between updates. // 刷新間隔時間(默認5秒)
8. -s col Column to sort by <cpu,vss,rss,thr> // 按哪列排序
9. -t Show threads instead of processes. // 顯示線程信息而不是進程
10. -h Display this help screen. // 顯示幫助文檔
11. $ top -n 1
12. top -n 1
就不把執行效果放上來了,總之結果表述如下:
1. User 35%, System 13%, IOW 0%, IRQ 0% // CPU佔用率
2. User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306 // CPU使用情況
3.
4. PID CPU% S #THR VSS RSS PCY UID Name // 進程屬性
5. xx xx% x xx xx xx xx xx xx
6.
7. CPU佔用率:
8. User 用戶進程
9. System 系統進程
10. IOW IO等待時間
11. IRQ 硬中斷時間
12.
13. CPU使用情況(指一個最小時間片內所佔時間,單位jiffies。或者指所佔進程數):
14. User 處於用戶態的運行時間,不包含優先值為負進程
15. Nice 優先值為負的進程所佔用的CPU時間
16. Sys 處於核心態的運行時間
17. Idle 除IO等待時間以外的其它等待時間
18. IOW IO等待時間
19. IRQ 硬中斷時間
20. SIRQ 軟中斷時間
21.
22. 進程屬性:
23. PID 進程在系統中的ID
24. CPU% 當前瞬時所以使用CPU佔用率
25. S 進程的狀態,其中S表示休眠,R表示正在運行,Z表示僵死狀態,N表示該進程優先值是負數。
26. #THR 程序當前所用的線程數
27. VSS Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
28. RSS Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
29. PCY OOXX,不知道什麼東東
30. UID 運行當前進程的用戶id
31. Name 程序名稱android.process.media
32.
33. // ps:內存佔用大小有如下規律:VSS >= RSS >= PSS >= USS
34. // PSS Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)
35. // USS Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)
在附件Android系統->android top.txt文件內,自個總結的。
2)執行代碼
1. // top命令
2. public static final String[] TOP = { "/system/bin/top", "-n", "1" };
3.
4. // 現在執行top -n 1,我們只需要第二行(用第二行求得CPU佔用率,精確數據)
5. // 第一行:User 35%, System 13%, IOW 0%, IRQ 0% // CPU佔用率
6. // 第二行:User 109 + Nice 0 + Sys 40 + Idle 156 + IOW 0 + IRQ 0 + SIRQ 1 = 306
7. // // CPU使用情況
8. public static synchronized String run(String[] cmd) {
9. String line = "";
10. InputStream is = null;
11. try {
12. Runtime runtime = Runtime.getRuntime();
13. Process proc = runtime.exec(cmd);
14. is = proc.getInputStream();
15.
16. // 換成BufferedReader
17. BufferedReader buf = new BufferedReader(new InputStreamReader(is));
18. do {
19. line = buf.readLine();
20. // 前面有幾個空行
21. if (line.startsWith("User")) {
22. // 讀到第一行時,我們再讀取下一行
23. line = buf.readLine();
24. break;
25. }
26. } while (true);
27.
28. if (is != null) {
29. buf.close();
30. is.close();
31. }
32. } catch (IOException e) {
33. e.printStackTrace();
34. }
35. return line;
36. }
37.
38. // 獲取指定應用的top命令獲取的信息
39. // PID CPU% S #THR VSS RSS PCY UID Name // 進程屬性
40. // 如果當前應用不在運行則返回null
41. public static synchronized String run(String[] cmd, String pkgName) {
42. String line = null;
43. InputStream is = null;
44. try {
45. Runtime runtime = Runtime.getRuntime();
46. Process proc = runtime.exec(cmd);
47. is = proc.getInputStream();
48.
49. // 換成BufferedReader
50. BufferedReader buf = new BufferedReader(new InputStreamReader(is));
51. do {
52. line = buf.readLine();
53. // 讀取到相應pkgName跳出循環(或者未找到)
54. if (null == line || line.endsWith(pkgName)) {
55. break;
56. }
57. } while (true);
58.
59. if (is != null) {
60. buf.close();
61. is.close();
62. }
63. } catch (IOException e) {
64. e.printStackTrace();
65. }
66. return line;
67. }
--------------------------------------------
PID:進程在系統中的ID
CPU% - 當前瞬時所以使用CPU佔用率
#THR - 程序當前所用的線程數
UID - 運行當前進程的用戶id
Name - 程序名稱org.xmpp.app
VSS - Virtual Set Size 虛擬耗用內存(包含共享庫佔用的內存)
RSS - Resident Set Size 實際使用物理內存(包含共享庫佔用的內存)
PSS - Proportional Set Size 實際使用的物理內存(比例分配共享庫佔用的內存)
USS - Unique Set Size 進程獨自佔用的物理內存(不包含共享庫佔用的內存)
一般來說內存佔用大小有如下規律:VSS >= RSS >= PSS >= USS
『貳』 如何編寫一個shell腳本查看某個進程是否在運行
1 、編寫一個shell腳本來查看某個進程是否在運行,用戶可以通過ps命令獲取所有的進程,然後通過awk命令提取進程名,再用grep提取相應的進程名即可。
2、參考代碼如下:
ps-aux|awk'{print$11}'|grep"^$1">/dev/null
case$?in
0)
echo"findprocess$1"
;;
1)
echo"$1isnotrunning"
;;
*)
echo"unknowerror"
esac
3、腳本運行結果如下