编译Android时,我们常用命令

make flashfiles -j8

-j8代表用系统的8个线程去编译

但是这样出来的log会直接打印在标准输出里,会存不全;而且因为是8个线程,会导致log的顺序是乱的

所以当我们编译过一次之后(大部分文件已经被编译了,下次编译会跳过,这样节省下大部分时间)

选择下面的命令编译比较好:

nohup make flashfiles -j1

log会存储在当前目录下的"nohup"文件中,并且-j1参数指定只用1个线程去编译,log顺序不会乱,这样方便我们排查编译错误。

 

补充:

一般情况下,我们需要看log里的error信息,如果步骤没错,一般出现的错误都是缺少依赖,这样我们就缺什么就安装什么。

 

补充:关于nohup,这是一个可以让当前shell语句在系统后台执行的command。标准的输出全部被重定向到当前文件夹的nohup中。

 

1.nohup

用途:不挂断地运行命令。

语法:nohup Command [ Arg … ] [ & ]

  无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。

  如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

  如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

退出状态:该命令返回下列出口值:   

  126 可以查找但不能调用 Command 参数指定的命令。   

  127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。   

  否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

2.&

用途:在后台运行

一般两个一起用

nohup command &

eg: nohup /usr/local/node/bin/node /www/im/chat.js >> /usr/local/node/output.log 2>&1 &

这条命令的意思是调用路径“/usr/local/node/bin/”下的“node”来运行“/www/im/”下的“chat.js”,让程序的运行过程不在前台显示,而是后台运行,最终将输出重定向到“ /usr/local/node/”下的“output.log”文件。

 

查看运行的后台进程

(1)jobs -l

jobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)

(2)ps -ef 

a:显示所有程序 
 u:以用户为主的格式来显示 
 x:显示所有程序,不以终端机来区分

(3)如果某个进程起不来,可能是某个端口被占用

查看使用某端口的进程

lsof -i:8090

netstat -ap|grep 8090

查看到进程id之后,使用netstat命令查看其占用的端口

netstat -nap|grep 7779

(4)终止后台运行进程

kill -9  进程号

 

linux下我们如果想一个任务或者程序还后台执行可以使用&,实际上linux还提供了其他任务调度的命令。

bg
将一个在后台暂停的命令,变成继续执行

fg
将后台中的命令调至前台继续运行

jobs
查看当前有多少在后台运行的命令

ctrl + z
可以将一个正在前台执行的命令放到后台,并且暂停

 

nohup 命令

用途:不挂断地运行命令。

 

   &的意思是在后台运行, 什么意思呢?  意思是说, 当你在执行 ./a.out & 的时候, 即使你用ctrl C,  那么a.out照样运行(因为对SIGINT信号免疫)。 但是要注意, 如果你直接关掉shell后, 那么, a.out进程同样消失。 可见, &的后台并不硬(因为对SIGHUP信号不免疫)。

 

      nohup的意思是忽略SIGHUP信号, 所以当运行nohup ./a.out的时候, 关闭shell, 那么a.out进程还是存在的(对SIGHUP信号免疫)。 但是, 要注意, 如果你直接在shell中用Ctrl C, 那么, a.out进程也是会消失的(因为对SIGINT信号不免疫)

 

      所以, &和nohup没有半毛钱的关系, 要让进程真正不受shell中Ctrl C和shell关闭的影响, 那该怎么办呢? 那就用nohua ./a.out &吧, 两全其美。

 

       如果你懂守护进程, 那么nohup ./a.out &颇有点让a.out成为守护进程的感觉。