nohup自动退出

两次pretrain bert的时候都因为挂起了nohup task,但是跑十个小时左右就会自动退出,后面根据时间点推测是不是没有exit服务器,今天查了下,的确有此种可能,目前在服务器做了对比实验。

正确的使用办法为:

1.先回车,退出nohup的提示。(nohup command &)
2.然后执行exit正常退出当前账户。
3.然后再去连接终端。使得程序后台正常运行。

另外建议用Tmux代替nohup.

常用shell脚本

1. 启动jupyter(可配置开机自启)

#!/bin/bash
origin_status=`ps -ef | grep -w jupyter | wc -l` # grep -w must match whole words;otherwise there is a difference between script and shell window.
if [ $origin_status -eq 1 ]
then
        current_time=`date "+%Y%m%d%H%M%S"`
        nohup jupyter notebook >jupyter.log_$current_time 2>&1 &
        now_status=`ps -ef | grep -w  jupyter | wc -l`
        if [ $now_status -eq 2 ]
        then
                echo "succeed in opening jupyter notebook at $current_time!"
        else
                echo "fail to open jupyter notebook."
        fi
else
        current_run=`expr $origin_status - 1`
        echo "$current_run jupyter notebook is open."
fi
1.修改文件
sudo vim /etc/rc.local
增加一行:su ubuntu -c /home/ubuntu/open_jupyter.sh (以ubuntu用户执行)

2.ubuntu 18.04 参考 https://zhuanlan.zhihu.com/p/63507762

3.注意
3.1 脚本中的所有函数或者命令都给出绝对路径,因为开机自启脚本会以root用户来执行
比如在该脚本中
nohup /home/ubuntu/anaconda3/bin/jupyter notebook >/home/ubuntu/jupyter.log_$current_time 2>&1 &

3.2 修改~/.jupyter/jupyter_notebook_config.py
c.NotebookApp.allow_root = True
c.NotebookApp.notebook_dir = '/home/ubuntu'

2. 自动登陆服务器(需要安装expect)

#!/usr/bin/expect
# set timeout 10 设置响应间隔
spawn ssh hostname@host
expect '*password*'
send "host pwd\r"
interact
#!/usr/bin/expect
set is_first [lindex $argv 0] #只能这样取得输入的参数,这是第一个参数,和bash不一样
set which_model [lindex $argv 1]
set which_ckpt [lindex $argv 2]
if { $is_first  == 1 } {# if只能这么写
        spawn ssh -i ~/Downloads/gongel_new.pem ubuntu@ec2-54-224-75-110.compute-1.amazonaws.com
        #172.31.45.39
        expect "Last login"
        send "rm -rf private_bert;sudo mount -t nfs -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,noresvport fs-151b9f95.efs.us-east-1.amazonaws.com:\/   ~\/efs-mount-point;git clone -b adv_mask_bert https:\/\/github.com\/gongel\/private_bert.git\r"
        expect "Username"
        send "@qq.com\r"
        expect "Password"
        send "\r"
        expect "Resolving deltas: 100%"
        send "cd private_bert;nohup bash helper_finetune_script $which_model $which_ckpt \&\r"
        expect "*nohup.out*"
        send "\rexit\r"
        interact
} else {
        spawn ssh -i ~/Downloads/gongel_new.pem ubuntu@ec2-54-224-75-110.compute-1.amazonaws.com
        expect "Last login"
        send "cd  private_bert\r"
        interact
}

3. 查看集群jps(这里免密)

hosts=('master' 'slave1' 'slave2')
for host in ${hosts[@]}
do
        echo "###### ${host} jps #####"
        ssh ${host} jps  # no need to run 'exit' command
done

Shell脚本学习之expect命令

Tmux简单使用教程

简单理解:不用挂后台,即使shell客户端关闭,命令继续执行。会话和窗口是独立的。

1.安装
# Mac
$ brew install tmux

# Ubuntu 或 Debian
$ sudo apt-get install tmux

# CentOS 或 Fedora
$ sudo yum install tmux
2.启动或退出
# 启动
tmux

# 退出
exit
3.新建会话
# 直接新建,默认编号0,1,...
tmux

# 自定义名称
tmux new -s <session-name>
4.分离对话:不同于退出,这只是分离,后面还可以继续连接
tmux detach #新建bash窗口
5.查看当前所有对话
tmux ls
6.连接对话
# 使用会话编号
$ tmux attach -t 0

# 使用会话名称
$ tmux attach -t <session-name>
7.杀死对话:等同于进入对话后然后exit
# 使用会话编号
$ tmux kill-session -t 0

# 使用会话名称
$ tmux kill-session -t <session-name>
8.切换对话:进入对话后 然后切换
# 使用会话编号
$ tmux switch -t 0

# 使用会话名称
$ tmux switch -t <session-name>

ref:Tmux 使用教程

另外get:防止iTerm/其他客户端不掉线

  • 永久:在/etc/ssh/ssh_config增加ServerAliveInterval 60(每60s向服务器发一次心跳);
  • 暂时:ssh -o ServerAliveInterval=60 hostname@host

awk 简单操作

工作总结…

#实验文本
1^I2$
3^I4$
5^I6$

1、列操作

打印第一列
(base) B00000094065z:~ gongel$ cat a | awk '{print $1}'
1
3
5
打印最后一列
(base) B00000094065z:~ gongel$ cat a | awk '{print $NF}'
2
4
6
加一列
(base) B00000094065z:~ gongel$ cat a | awk '{print $0"\ta"}'
1	2	a
3	4	a
5	6	a
加一列(按行操作,多此一举)
'''
shell脚本
cat $1 | while read line
do
    echo $line | awk '{print $0"\ta"}';
done
'''

(base) B00000094065z:~ gongel$ sh ts.sh a
1 2 a
3 4 a
5 6 a

2、行操作

NR为当前处理行
(base) B00000094065z:~ gongel$ cat a | awk '{print NR":"$0}'
1:1	2
2:3	4
3:5	6

3、统计命令(BEGIN/END)

求和
(base) B00000094065z:~ gongel$ cat a|awk '{sum+=$1} END {print "Sum = ", sum}'
Sum =  9
求平均
(base) B00000094065z:~ gongel$ cat a|awk '{sum+=$1} END {print "Average = ", sum/NR}'
Average =  3
求最大值
(base) B00000094065z:~ gongel$ cat a|awk 'BEGIN {max = 0} {if ($1>max) max=$1 fi} END {print "Max=", max}'
Max= 5

阮一峰awk 入门教程

docker常见命令

1.docker version
显示 Docker 版本信息

2.docker info
显示 Docker 系统信息,包括镜像和容器数

3.docker search
docker search [options "o">] term
docker search -s  django
从 Docker Hub 中搜索符合条件的镜像
--automated 只列出 automated build
类型的镜像;
--no-trunc 可显示完整的镜像描述;
-s 40 列出收藏数不小于40的镜像。

4.docker pull
docker pull [-a "o">] [user/ "o">]name[:tag "o">]
docker pull laozhu/telescope:latest
从 Docker Hub 中拉取或者更新指定镜像。
-a 拉取所有 tagged 镜像 

5.docker images
docker images [options "o">] [name]
列出本地所有镜像。其中 [name] 对镜像名称进行关键词查询。
-a 列出所有镜像(含过程镜像);
-f 过滤镜像,如: -f ['dangling=true'] 只列出满足
dangling=true 条件的镜像;
--no-trunc 可显示完整的镜像ID;
-q 仅列出镜像ID。
--tree 以树状结构列出镜像的所有提交历史。

6.docker ps
列出所有运行中容器
-a 列出所有容器(含沉睡镜像);
--before="nginx" 列出在某一容器之前创建的容器,接受容器名称和ID作为参数;
--since="nginx" 列出在某一容器之后创建的容器,接受容器名称和ID作为参数;
-f [exited=<int>] 列出满足
exited=<int> 条件的容器;
-l 仅列出最新创建的一个容器;
--no-trunc 显示完整的容器ID;
-n=4 列出最近创建的4个容器;
-q 仅列出容器ID;
-s 显示容器大小。

7.docker rmi
docker rmi [options "o">] <image>  "o">[image...]
docker rmi nginx:latest postgres:latest python:latest
从本地移除一个或多个指定的镜像
-f 强行移除该镜像,即使其正被使用;
--no-prune 不移除该镜像的过程镜像,默认移除。

8.docker rm
docker rm [options "o">] <container>  "o">[container...]
docker rm nginx-01 nginx-02 db-01 db-02
sudo docker rm -l /webapp/redis
-f 强行移除该容器,即使其正在运行;
-l 移除容器间的网络连接,而非容器本身;
-v 移除与容器关联的空间。

9.docker start|stop|restart
docker start|stop "p">|restart [options "o">] <container>  "o">[container...]
启动、停止和重启一个或多个指定容器。
-a 待完成
-i 启动一个容器并进入交互模式;
-t 10 停止或者重启容器的超时时间(秒),超时后系统将杀死进程。

10.docker inspect
docker instpect nginx:latest
docker inspect nginx-container
检查镜像或者容器的参数,默认返回 JSON 格式。
-f 指定返回值的模板文件。

11.进入容器
sudo docker exec -it 775c7c9ee1e1 /bin/bash 退出容器后容器不会停止
docker attach 44fc0f0582d9 多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示

ref:docker常用命令