Linux 执行多行命令的方法与区别(解决supervisor启动使用GPU的python服务)

在很多情况下,我们需要一次性执行多条命令。比如我在用supervisor启动python服务的时候就有类似的需求。

对于我的例子背景是通过supervisor监控python在python 35环境下的GPU使用的服务,其中分三个块:python35环境的需求、GPU服务的使用、服务自动重启。当python挂掉的时候,supervisor要能够监控到并实现自动重启,在用GPU的时候就会有个坑,error code(2): out of memory,很多用GPU的小伙伴不会对这个error陌生的。我们做的图像处理相关的服务,尽管我们限制图片及batch的大小并进行了图片压缩处理,但是依然无法保存这种问题不出现,但是出现后,我们发现python依然占用着GPU的memory没有释放,你重启服务会一直失败,除非你kill掉python。

error 如下:

THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1524582441669/work/aten/src/THC/generic/THCStorage.cu line=58 error=2 : out of memory

但是GPU却没有释放

Linux 执行多行命令的方法与区别(解决supervisor启动使用GPU的python服务)_第1张图片

那我们在supervisor的configure的command里就得需要执行多行语句了。

killall python

source activate py35

python /home/lawenliu/myservice

那这个时候我们就需要考虑几条命名的执行关系了。首先了解一下几种命令连接服务的关系。

1. “||”:用于连接两条命令,第一条命令失败的时候,才会执行第二条语句

2. “&&”:用于连接两条命令,第一条命令执行成功的情况下才会执行第二条语句

3. “;”:用于连接两条命令,两条命令执行相互独立,第一条执行成功与否不会影响第二条(当然特殊情况除外,比如系统重启、关机、关闭命令行,则会造成第二条命令行被丢弃)

4. “|”:用于连接两条命令,起到管道作用,把第一条的结果传输给第二条命令,第一条命令执行出错及第二条命令出错都会报错

从上面几个命令连接符,我们选择如下方式改变supervisor里命令行:

command=env GOTRACEBACK=crash /bin/bash -c "killall python;source activate py35 && python /home/lawenliu/myservice"

你可能感兴趣的:(Linux 执行多行命令的方法与区别(解决supervisor启动使用GPU的python服务))