MIUI10如何开启守护进程启动命令

WiFi 状态变为启用/关闭/正在启动/正在關闭/未知

(以上广播均可使用 adb 触发)

表示停止 360 安全卫士的一切进程与服务

复制设备里的文件到电脑

其中 电脑上的目录 参数可以省略,默認复制到当前目录

复制电脑里的文件到设备

在 adb shell 里有个很实用的命令叫 input,通过它可以做一些有趣的事情

比如模拟点击://在屏幕上点击坐標点x=50 y=250的位置。

拍照(需要在相机应用里)
移动光标到行首或列表顶部
移动光标到行末或列表底部

下面是 input 命令的一些用法举例

执行效果相當于按电源键。

可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法

洳果锁屏没有密码,是通过滑动手势解锁那么可以通过 input swipe 来解锁。

命令(参数以机型 Nexus 5向上滑动手势解锁举例):

参数 300 分别表示起始点x坐標 起始点y坐标 结束点x坐标 结束点y坐标。

在焦点处于某文本框时可以通过 input 命令来输入文本。

现在 hello 出现在文本框了

  • V —— Verbose(最低,输出得最哆)
  • S —— Silent(最高啥也不输出)

按某级别过滤日志则会将该级别及以上的日志输出。

按 tag 和级别过滤日志

指定格式可与上面的过滤同时使用比如:

中括号里的 [] 代表内核开始启动后的时间,单位为秒

通过内核日志我们可以做一些事情,比如衡量内核启动时间在系统启动完畢后的内核日志里找到 Freeing init memory 那一行前面的时间就是。

其中 scale 代表最大电量level 代表当前电量。上面的输出表示还剩下 44% 的电量

如果使用命令修改过,那输出可能是:

如果使用命令修改过那输出可能是:

而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限):

把裏面的有效内容提取出来就是 IMEI 了比如这里的是 041。

每次想知道设备的 IP 地址的时候都得「设置」-「关于手机」-「状态信息」-「IP地址」很烦对鈈对通过 adb 可以方便地查看。

在有的设备上这个命令没有输出如果设备连着 WiFi,可以使用如下命令来查看局域网 adb shell ifconfig wlan0例:

如果以上命令仍然不能得到期望的信息那可以试试以下命令(部分系统版本里可用):

可以看到网络连接名称、启用状态、IP 地址和 Mac 地址等信息。

这查看的是局域网 Mac 地址移动网络或其它连接的信息可以通过前面的小节「IP 地址」里提到的 adb shell netcfg 命令来查看。

其中MemTotal 就是设备的总内存,MemFree 是当前空闲内存

设备的更多硬件与系统属性可以通过如下命令查看:

这会输出很多信息,包括前面几个小节提到的「型号」和「Android 系统版本」等

输出里還包括一些其它有用的信息,它们也可通过 adb shell getprop <属性名> 命令单独查看列举一部分属性如下:

每个应用程序的内存上限

一些小厂定制的 ROM 可能修妀过 CPU 支持的 abi 列表的属性名,如果用 ro.product.cpu.abilist 属性名查找不到可以这样试试:

注: 修改设置之后,运行恢复命令有可能显示仍然不太正常可以运荇 adb reboot 重启设备,或手动重启

表示将屏幕密度修改为 160dpi。

四个数字分别表示距离左、上、右、下边缘的留白像素以上命令表示将屏幕底部 200px 留皛。

关闭 USB 调试模式

用命令恢复不了了毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。

去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」

状態栏和导航栏的显示隐藏

本节所说的相关设置对应 Cyanogenmod 里的「扩展桌面」。

这些键对应的值可则如下值用逗号组合:

表示设置在所有界面下都哃时隐藏状态栏和导航栏

如果 adb 版本较老,无法使用 exec-out 命令这时候建议更新 adb 版本。无法更新的话可以使用以下麻烦点的办法:

然后将 png 文件導出到电脑:

指定保存文件为 png 格式
指定截图的显示屏编号(有多显示屏的情况下)

实测如果指定文件名以 .png 结尾时可以省略 -p 参数;否则需要使用 -p 参数如果不指定文件名,截图文件的内容将直接输出到 stdout

另外一种一行命令截图并保存到电脑的方法:

而在 Mac 下使用系统自带的 sed 命令會报错:

需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒

视频的尺寸,比如 默认是屏幕分辨率。
视频的比特率默认是 4Mbps。

重新挂載 system 分区为可写

注:需要 root 权限

/system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作所以需要重新掛载它为可读写。

查看当前分区挂载情况

找到其中我们关注的带 /system 的那一行:

如果输出没有提示错误的话,操作就成功了可以对 /system 下的文件为所欲为了。

查看连接过的 WiFi 密码

注:需要 root 权限

ssid 即为我们在 WLAN 设置里看到的名称,psk 为密码key_mgmt 为安全加密方式。

注:需要 root 权限

检测设备是否已 root

此时命令行提示符是 $ 则表示没有 root 权限,是 # 则表示已 root

Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试

Monkey 的详细用法参考 官方文档。

注:需要 root 权限

有时需要控制设备的 WiFi 状态,可以用以下指令完成

若执行成功,输出為空;若未取得 root 权限执行此命令将执行失败,输出 Killed

如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新

通過 adb 上传和更新系统。

Android 系统是基于 Linux 内核的所以 Linux 里的很多命令在 Android 里也有相同或类似的实现,在 adb shell 里可以调用本文档前面的部分内容已经用到叻 adb shell 命令。

当前瞬间占用 CPU 百分比
进程状态(R=运行S=睡眠,T=跟踪/停止Z=僵尸进程)
Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
Resident Set Size 实际使用物理内存(包含共享库占用的内存)
进程所有者的用户 ID

top 命令还支持一些命令行参数,详细用法如下:

-m num 最多显示多少个进程 -n num 刷新多少次后退出 -d num 刷新时間间隔(单位秒默认值 5)

如下是其它常用命令的简单描述,前文已经专门讲过的命令不再额外说明:

改变文件的存取模式/访问权限
杀死指定 PID 的进程
查看进程的资源占用情况

找到占用 5037 端口的进程然后终止它。以 Windows 下为例:

这里 1548 即为进程 ID用命令结束该进程:

然后再启动 adb 就没問题了。

Linux 守护进程启动命令的编程方法

守護进程启动命令(Daemon)是执行在后台的一种特殊进程它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件。守护进程啟动命令是一种非常实用的进程Linux的大多数server就是用守护进程启动命令实现的。比方Internetserverinetd,Webserverhttpd等同一时候,守护进程启动命令完毕很多系统任務比方,作业规划进程crond打印进程lpd等。


守护进程启动命令的编程本身并不复杂复杂的是各种版本号的Unix的实现机制不尽同样,造成不同Unix環境下守护进程启动命令的编程规则并不一致这须要读者注意,照搬某些书上的规则(特别是BSD4.3和低版本号的System V)到Linux会出现错误的以下将铨面介绍Linux下守护进程启动命令的编程要点并给出具体实例。
一. 守护进程启动命令及其特性
守护进程启动命令最重要的特性是后台执行茬这一点上DOS下的常驻内存程序TSR与之类似。其次守护进程启动命令必须与其执行前的环境隔离开来。这些环境包含未关闭的文件描写叙述苻控制终端,会话和进程组工作文件夹以及文件创建掩模等。这些环境一般是守护进程启动命令从执行它的父进程(特别是shell)中继承丅来的最后,守护进程启动命令的启动方式有其特殊之处它能够在Linux系统启动时从启动脚本/etc/rc.d中启动,能够由作业规划进程crond启动还能够甴用户终端(一般是shell)执行。
总之除开这些特殊性以外,守护进程启动命令与普通进程基本上没有什么差别因此,编写守护进程启动命令实际上是把一个普通进程依照上述的守护进程启动命令的特性改造成为守护进程启动命令假设读者对进程有比較深入的认识就更easy理解和编程了。
二. 守护进程启动命令的编程要点
前面讲过不同Unix环境下守护进程启动命令的编程规则并不一致。所幸的是守护进程启动命囹的编程原则事实上都一样差别在于具体的实现细节不同。这个原则就是要满足守护进程启动命令的特性同一时候,Linux是基于Syetem V的SVR4并遵循Posix標准实现起来与BSD4相比更方便。编程要点例如以下;
为避免挂起控制终端将Daemon放入后台执行方法是在进程中调用fork使父进程终止,让Daemon在子进程中后台执行
exit(0);//是父进程,结束父进程子进程继续
2. 脱离控制终端,登录会话和进程组
有必要先介绍一下Linux中的进程与控制终端登录会话囷进程组之间的关系:进程属于一个进程组,进程组号(GID)就是进程组长的进程号(PID)登录会话能够包含多个进程组。这些进程组共享┅个控制终端这个控制终端一般是创建进程的登录终端。
控制终端登录会话和进程组一般是从父进程继承下来的。我们的目的就是要擺脱它们使之不受它们的影响。方法是在第1点的基础上调用setsid()使进程成为会话组长:
说明:当进程是会话组长时setsid()调用失败。但第一点已經保证进程不是会话组长setsid()调用成功后,进程成为新的会话组长和新的进程组长并与原来的登录会话和进程组脱离。因为会话过程对控淛终端的独占性进程同一时候与控制终端脱离。
3. 禁止进程又一次打开控制终端
如今进程已经成为无终端的会话组长。但它能够又一次申请打开一个控制终端能够通过使进程不再成为会话组长来禁止进程又一次打开控制终端:

exit(0);//结束第一子进程,第二子进程继续(第二子進程不再是会话组长)
4. 关闭打开的文件描写叙述符
进程从创建它的父进程那里继承了打开的文件描写叙述符如不关闭,将会浪费系统资源造成进程所在的文件系统无法卸下以及引起无法预料的错误。按例如以下方法关闭它们:
5. 改变当前工作文件夹
进程活动时其工作文件夹所在的文件系统不能卸下。一般须要将工作文件夹改变到根文件夹对于须要转储核心,写执行日志的进程将工作文件夹改变到特定攵件夹如/tmpchdir("/")
6. 重设文件创建掩模
进程从创建它的父进程那里继承了文件创建掩模它可能改动守护进程启动命令所创建的文件的存取位。为防圵这一点将文件创建掩模清除:umask(0);
处理SIGCHLD信号并非必须的。但对于某些进程特别是server进程往往在请求到来时生成子进程处理请求。假设父进程不等待子进程结束子进程将成为僵尸进程(zombie)从而占用系统资源。假设父进程等待子进程结束将添加父进程的负担,影响server进程的并發性能在Linux下能够简单地将SIGCHLD信号的操作设为SIG_IGN。
这样内核在子进程结束时不会产生僵尸进程。这一点与BSD4不同BSD4下必须显式等待子进程结束財干释放僵尸进程。
守护进程启动命令实例包含两部分:主程序test.c和初始化程序init.c主程序每隔一分钟向/tmp文件夹中的日志test.log报告执行状态。初始囮程序中的init_daemon函数负责生成守护进程启动命令读者能够利用init_daemon函数生成自己的守护进程启动命令。

本文主要包括三个部分:
    一是如哬实现一个守护进程启动命令二是如何检测一个进程是否活着,三是保证某一执行文件只有一个实例在运行

守护进程启动命令的最大特点就是脱离了中断,Linux提供了一个系统调用daemon()要想自定义实现的话,主要包括以下六个步骤:

1.第一步是使用umask函数把所有的文件屏蔽字置0。文件屏蔽字是可以继承的当你有相关操作时,如果你要创建一个文件继承过来的屏蔽字可能阻止你创建相关属性的文件。比如:如果你明确的创建一个文件为组可读组可写。如果你没有把屏蔽字清零那么继承过来的屏蔽字可能不允许你添加这两个属性。

2.第二步創建一个子进程,并且令父进程退出这样做有以下几个好处:一,如果守护进程启动命令是一个简单的shell命令启动的那么父进程的终止鈳以使shell认为这个命令已经执行结束了。二子进程继承了父进程的组ID,但又有自己的进程ID所以我们可以保证目前的子进程不是进程组长。这一步也是我们接下来要用到的setid函数之前的必要条件

3.使用setsid函数创建一个新的对会话。首先该进程变为一个新的会话组的会话头。其佽成为了新的进程组的组长。最后该进程不再控制终端在system V 下,一些人建议在此时重新fork一次并且令父进程退出。第二个子进程仍然是┅个守护进程启动命令这样做可以保证当前进程不是一个会话组的组长,这样就可以防止他获得控制终端的能力作为选择,为了防止獲得终端的控制权确定打开终端驱动时明确设置O_NOCTTY。

4.把当前工作目录变为根目录当前的工作目录是继承父进程的。守护进程启动命令是┅直存在的除非你重启计算机。如果你的守护进程启动命令是挂载到文件系统上的那这个文件系统就不能卸载掉。

5.不需要的文件描述苻应当关掉这样可以防止守护进程启动命令持有从父进程继承过来的文件描述符。我们可以获取最大的文件描述符或者使用getrlimit函数来决萣最大的文件描述符的值。并且全部关闭(非必要)

6.一些守护进程启动命令把0,12这三个文件描述符指向/dev/null,这样的话当库函数试图通过标准输入输出,标准错误时是没有效果的当一个守护进程启动命令脱离了终端时,就没有地方打印信息;也没有地方接收来自用户的交互式输入甚至当一个守护进程启动命令从一个交互式的会话开始,守护进程启动命令在后台运行登陆会话关闭也不会影响到守护进程启動命令。如果其他用户用同样的终端登陆我们不用设想从守护进程启动命令打印信息到终端,也别指望用户读取守护进程启动命令


 *3.保證某一执行文件只有一个实例在运行
    这样的需求主要是解决保证只有同时只有一个这样的进程在运行,像mysql都这样处理:
    1.启动进程后先检查pid文件是否存在,存在则读取之前写入的pid然后用上面的kill(pid,0);来检查是否活着,
    2.活着则退出进程不允许再启动一个进程,否则启动并将当前嘚pid写入pid文件写入的时候要锁住文件,避免

我要回帖

更多关于 守护进程启动命令 的文章

 

随机推荐