linux上的任务

jobs, bg, fg 命令

jobs列出本会话所有任务
bg命令用于将作业放到后台运行,使前台可以执行其他任务。该命令的运行效果与在指令后面添加符号&的效果是相同的,都是将其放到系统后台执行。 Ctrl+Z后任务会暂停,bg命令可以让任务在后台继续运行。
fg命令用于将后台作业(在后台运行的或者在后台挂起的作业)放到前台终端运行。与bg命令一样,若后台任务中只有一个,则使用该命令时,可以省略任务号。

让进程在后台可靠运行的几种方法

技巧:让进程在后台可靠运行的几种方法

nohup ping www.ibm.com &
setsid ping www.ibm.com
(ping www.ibm.com &)
# disown 命令
# screen 命令
[/bash]

如何将正在运行的任务放入后台

使用& nohup启动的命令直接被放入后台,但是如果忘记输入&,或者你还要注销登录这次会话时,怎么办?
:第一步,Ctrl+Z把任务暂停,然后 bg %jobnumber 把任务放入后台运行。
若想在切回前台,使用fg %jobnumber 即可。

第二步,disown可以让任务忽略本任务的hangup信号。只放入后台的任务而不是使用nohup启动的,它也是要接受本会话的hangup的。
disown "%./experiments/scripts/faster_rcnn_end2end.sh"

其他知识

disown是bash内部命令,nohup是外部命令
disownbg,fg一样是针对job进行操作,nohup是针对命令操作
disown -hnohup一样,在退出bash后,把进程的控制权都交给init

其他用于管理用户会话的命令:
tty 列出本会话会话号
w 列出当前所有登录会话
skillpkill 可以给任务发信号, 如 skill -KILL -v pts/4 把会话pts/4的所有任务发kill信号。

更强大的是使用screen管理会话,但是ubuntu默认没有安装该程序,此命令网上知识也很多。

手动通知caffe快照操作等小技巧

caffe支持接受SIGHUP信号进行快照操作,所以命令就是:

# PID是caffe的进程号
kill -SIGHUP PID

# 查看PID的命令
ps -ef | grep caffe

# 或者使用pidof命令,这次一步完成
kill -SIGHUP $(pidof caffe)

使用caffe的solverstate继续训练的命令格式

./build/tools/caffe train --solver=solver.prototxt --snapshot=caffenet_train_iter_10000.solverstate

最简单caffe模型测试命令

import caffe
import numpy as np
import cv2
 
# 把图读进来解码
im = cv2.imread('000001.jpg',cv2.IMREAD_COLOR)
# 把图resize了 并转成网络input的shape大小
imblob=np.transpose(cv2.resize(im,(224,224)).reshape((1,224,224,3)),(0,3,1,2))
 
n = caffe.Net('deploy.prototxt','vgg16_iter_20000.caffemodel',caffe.TEST)
n.forward(data=imblob.astype(np.float32))

# 在直接取出输出层的结果即可,如
print n['cls_prob']

bash中的算术

expr

expr命令是最常用的计算命令,但是expr只能进行整数计算,另外若要使用括号和乘法,需要转义\* \( \)避免shell中的特殊含义。

expr 2 + 4
expr 2 \* 4

注意全部都要空白分割。
另外,expr除了支持简单运算和数字比较外,还支持一些字符串运算。请详查其文档。

可以计算小数的bc

echo "scale=2; 3.3 + 3.4" | bc
bc <<< "scale=2; 3.3 + 3.4"

bc是个强大的计算工具,还有内置数学库,可以计算诸如三角函数类的运算。
另外还有不直观略显复杂的的dc,不写了。

awk也能算

echo 2.2 3.1 |awk '{print $1+$2}'

let和双圆括号(())

let命令是bash中用于整数计算的工具,提供常用运算符还提供了方幂**运算符。在变量的计算中不需要加上$来表示变量,如果表达式的值是非0,那么返回的状态值(即$?)是0;否则,返回的状态值是1。

let命令用空格分割每个计算式, 可以指定多个计算式,比如let a=5+4 b=9-3; echo $a $b, 单个表达式有空格的话需要加引号,即let "a = 5 + 4",注意和expr的区别,expr中都要空白分割的。

双圆括号(())是bash的算术运算语法,其中的变量可以加$也可以不加,等同于let计算一个表达式;双圆括号外不加$的话无法取出结果,但运算还是执行了的。

$[]也可以执行算术运算,旧形式。

这样,对变量i加1就有下面几种形式:

i=`expr $i + 1`;
let i+=1;
((i++));
i=$[$i+1];
i=$(( $i + 1 ))

ubuntu获取网卡IP和MAC地址

ip addr | grep link/ether | awk '{print $2}'
ip=`ifconfig eth0 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'`
mac=`ifconfig | grep HWaddr | awk -F" " '{print $5}'`
/sys/class/net/eth0/address
# lshw可以获取很多硬件信息哦
lshw -class network
# 获取网卡名称
ip -o -4 route show to default | awk '{print $5}'

问题1,环回lo和虚拟网卡要不要
docker或者别的虚拟网卡存在,看您需要不需要避免获取到虚拟网卡的。

问题2,网卡命名的问题
之前一般被系统命名为eth0,现在改别的命名规则了。看要不要把网卡名称写死了,还是要求自动获取网卡名。

问题3,多网卡
这个问题一般不重要,一般也就不用指定特定网卡,只要是真实网络接口即可。若只需要一个,awk里打印完一个立即 exit 即可。

那这段代码有什么用呢?
比如自动设置机器名称为与MAC地址有关的名字避免克隆系统名称冲突,就可以写个服务启动后立即修改下机器名 hostname,更改机器名称为MAC有关