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默认没有安装该程序,此命令网上知识也很多。

挂载指定标签的磁盘到指定挂载点

按标签挂载挂载保证同样标签的磁盘挂载都同一个地方。

/etc/fstab内容

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
# 把LABEL是MYDATADISK的磁盘挂载到/home/renwei/datadisk目录
LABEL=MYDATADISK /home/renwei/datadisk ext4 defaults 0 2

磁盘的LABEL怎么管理?

1 命令 e2label 或者tune2fs
Usage:

e2label device [newlabel]
tune2fs -L labelname /dev/your_block_device

2 ubuntu系统的disks工具(图形界面)
“Edit Filesystem…” 就是更改磁盘LABEL的,只不过ubuntu这里这名字取的无语。

使用WQL获取硬件信息

WQL(SQL for WMI),就是用SQL语法来查询硬件信息,简单吧。

示例代码:Example: Getting WMI Data from the Local Computer,示例的是查询操作系统名称,你也可以查询磁盘信息等等,具体能查什么,那就去Win32 Provider这儿查就行了。

获取硬件信息有什么用?

制作软件授权系统啊,让客户端发来采集的硬件信息,我们把这些硬件信息和授权信息一块用私钥签名一下发给客户端,客户端只需要用携带的公钥验证下签名就可以知道授权文件是否合法。比注册串码系统简单好用多了。

加密、解密、签名和验证签名

tensorflow几个简单tips

tensorboard

# default port 6006, use `--port=xxxx` to specify port 
tensorboard --logdir=/path/to/logdir
# or
python ~/.local/lib/python2.7/site-packages/tensorflow/tensorboard/tensorboard.py --logdir=/path/to/logdir

对于keras,有内容callback能记录日志支持

    tb = keras.callbacks.TensorBoard(log_dir='/path/to/logdir', histogram_freq=0, batch_size=32, write_graph=True, write_grads=False,
                                write_images=False, embeddings_freq=0, embeddings_layer_names=None,
                                embeddings_metadata=None)
    callbacks.append(tb)

设置使用的GPU

shell终端命令执行程序时设置使用的GPU

CUDA_VISIBLE_DEVICES=1 python my_training_script.py

2 python代码中设置使用的GPU

import os
os.environ["CUDA_VISIBLE_DEVICES"] = "2"

设置tensorflow使用的显存大小

定量(定比例)设置显存

默认tensorflow是使用GPU尽可能多的显存。可以通过下面的方式,来设置使用的GPU显存:

gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

上面分配给tensorflow的GPU显存大小为:GPU实际显存*0.7。
可以按照需要,设置不同的值,来分配显存。

按需设置显存

上面的只能设置固定的大小。如果想按需分配,可以使用allow_growth参数(参考网址:http://blog.csdn.net/cq361106306/article/details/52950081):

gpu_options = tf.GPUOptions(allow_growth=True)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

tensorflow models

tensorflow models 提供的object_detection/export_inference_graph.py会生成frozen_inference_graph.pbmodel.ckptsaved_model.pb
ckpt的data保存了weights,meta保存了graph和metatada。 仅从.ckpt-meta.ckpt-data中就可以恢复出模型。pb文件一个文件就包含graph和data。
生产环境中进行预测的时候是只需要模型和权重,不需要metadata,所以需要将其提出进行freeze操作,将所需的部分放到一个文件,方便之后的调用,也减少模型加载所需的内存。(在下载的预训练模型解压后可以找到4个文件,其中名为frozen_inference_graph.pb的文件就是freeze后产生的模型文件,比weights文件大,但是比weights和meta文件加起来要小不少。)
tensorflow目标检测模型的压缩和ncnn转换
Tensorflow物体检测(Object Detection)API的使用

 

mantisBT和git集成

mantisBT上的设置


注:我使用的是cgit提供git库的web服务。

git hook内容

repositories/dockertrain.git/hooks/post-receive 文件内容

#!/bin/sh
API_KEY=6dcde9b4c68c4507f68b6ec3
# Repository ID
ID=20
CURL=/usr/bin/curl
URL="http://localhost/mantis/plugin.php?page=Source/import&amp;api_key=${API_KEY}&amp;id=${ID}"
${CURL} ${URL}

API_KEY 在MantisBT插件配置页面Source Control Integration: Configuration获取或设置。

手动通知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']

自建docker-registry服务

本地运行registry服务

命令:

docker run -d -p 5000:5000 -v /home/renwei/docker-repositories:/var/lib/registry --restart=always --name registry registry

客户机器上的设置方法

原来的docker在Ubuntu要修改文件 /lib/systemd/system/docker.service :

ExecStart=/usr/bin/dockerd --insecure-registry=192.168.1.2:5000 -H fd://

对于现在的docker-ce,修改/etc/docker/daemon.json文件(如果没有此文件就创建)

{
  "insecure-registries" : ["myregistrydomain.com:5000"]
}

修改完记得重启docker服务

sudo service docker restart

继续阅读自建docker-registry服务

加密、解密、签名和验证签名

先来看看来源于Implementation of the Licensing System for a Software Product的一张图,很好地诠释了签名和验证签名的过程。

python使用Crypto库完成签名、验证签名、加密和解密的示例:signfile.py

shell中直接使用gpgopenssl等工具完成签名、验证签名、加密和解密。

注意:无论如何,记住这一点,私钥是不应该透露给别人的。

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 ))

apache 使用 CGI 方式调用 python

设置方法:在xampp\apache\conf\httpd.conf中找到这行AddHandler cgi-script .cgi .pl .asp,添加.py成为AddHandler cgi-script .cgi .pl .asp .py,然后重启apache。

py脚本第一行写清楚python解释器就可以了,如我直接使用的是 Visual Studio 中的python,整个示例:

#!"C:/Program Files (x86)/Microsoft Visual Studio/Shared/Python36_64/python.exe"

# cgi sample

print("Content-type: text/html\n\n")
print("<html><head><title>Hello World from Python</title></head><body>Hello World from a Python CGI Script</body></html>")

放在xampp\htdocs中就可以了。