shell进程管理

判断进程是否还在work,如果进程被kill掉进行重启

python_path=/da1/hdp-svideo-algo/wangxiaoyang/miniconda3/bin/python

src_base_dir=/da1/hdp-svideo-algo/wangxiaoyang/zm/recall/src
mod_name=action_dislike_userid.py

NUM=`ps aux | grep ${mod_name} | grep -v grep |wc -l`

curr_time=$(date)

echo ${curr_time}, "process cnt of ${mod_name} is ",${NUM}
if [ "${NUM}" -lt "1" ];then
    echo "${mod_name} was killed"
    cd ${src_base_dir}
    nohup ${python_path} ${src_base_dir}/${mod_name} &
fi

tips

ps aux | grep zm_cold

返回结果为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A6tbz9GQ-1641817679260)(/var/folders/s5/l83d0_8x4pz6q1gwvs28_jsr0000gn/T/abnerworks.Typora/image-20220110193935208.png)]

下面第二行返回的原因是grep本身就是一个进程,如果只看进程名对应的进程信息,我们需要进行过滤

ps aux | grep zm_cold | grep -v grep

nohup命令

nohup Command [ Arg … ] [ & ]

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。

nohup command &

nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部。

如何查看nohup命令?

jobs -l

jobs命令只看当前终端生效的,关闭终端后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)

ps -aux | grep zm_cold
 a:显示所有程序 
 u:以用户为主的格式来显示 
 x:显示所有程序,不以终端机来区分

再用awk提取一下进程ID

ps -aux | grep zm_cold | grep -v grep | awk '{print $2}'

nohup重定向

操作系统中有三个常用的流:
  0:标准输入流 stdin
  1:标准输出流 stdout
  2:标准错误流 stderr

2>&1的意思

这个意思是把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件output里面,所以结果是标准错误和标准输出都导入文件output里面了。 至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。这就会导致 >output 2>output 文件output被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的. 这就是为什么有人会写成: nohup ./command.sh >output 2>output出错的原因了 。

 //只输出错误信息到日志文件
nohup ./program >/dev/null 2>log &
//什么信息也不要
nohup ./program >/dev/null 2>&1 &

关于/dev/null文件

​ Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐