编译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成为守护进程的感觉。