全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
查看: 1914|回复: 13

[Windows VPS] 请教各位MJJ大佬一个编写shell的问题

[复制链接]
发表于 2021-5-15 00:58:50 | 显示全部楼层 |阅读模式
我设想的功能:

1、先检测相关进程,若相关进程的PID存在,则提示进程已存在
2、若检测不到相关进程的PID,则执行启动命令
这两步我已经实现。
3、启动第2步的进程之后,再次检测进程
4、执行第3步的进程检测后,若进程存在,则发出成功提示,若进程不存在,则发出失败提示。

求助各位MJJ大雕

我的第1和第2步的 代码:

  1. function start_namesrv() {
  2. NAMESRV_PID=`ps -ax | grep -v grep | grep java | grep -i 'org.apache.rocketmq.namesrv.NamesrvStartup' | awk '{print $1}'`
  3.         if [[ -n ${NAMESRV_PID} ]];then
  4.                 echo -e "\033[1;42;37m +++ The RocketMQ_namesrv(${NAMESRV_PID}) is already exsit... \033[0m"
  5.         else
  6.                 cd ${ROCKETMQ_BIN}
  7.                 nohup sh mqnamesrv -n ${ADDR}:${NAMESRV_PORT} > ${NAMESRV_RUN_LOG} 2>&1 &
复制代码
发表于 2021-5-15 01:09:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2021-5-15 01:12:14 | 显示全部楼层
本帖最后由 G.K.D 于 2021-5-15 01:19 编辑

你这,在启动进程命令后面,直接再重复一遍上面的检测进程代码不就行了么?(检测刚刚运行的程序进程

还是说我理解错你的意思了?

为了避免检测太早,建议在启动进程命令后面加个 sleep 2s 命令暂停 2 秒或 1 秒也行(后面紧接着检测进程代码)。

  1. function start_namesrv() {
  2.     NAMESRV_PID=`ps -ax | grep -v grep | grep java | grep -i 'org.apache.rocketmq.namesrv.NamesrvStartup' | awk '{print $1}'`
  3.     if [[ -n ${NAMESRV_PID} ]];then
  4.         echo -e "\033[1;42;37m +++ The RocketMQ_namesrv(${NAMESRV_PID}) is already exsit... \033[0m"
  5.     else
  6.         cd "${ROCKETMQ_BIN}"
  7.         nohup sh mqnamesrv -n ${ADDR}:${NAMESRV_PORT} > ${NAMESRV_RUN_LOG} 2>&1 &
  8.         sleep 2s
  9.         NAMESRV_PID=`ps -ax | grep -v grep | grep java | grep -i 'org.apache.rocketmq.namesrv.NamesrvStartup' | awk '{print $1}'`
  10.         if [[ -n ${NAMESRV_PID} ]];then
  11.             echo -e "启动成功..."
  12.         else
  13.             echo -e "启动失败..."
  14.         fi
  15.     fi
  16. }
复制代码
发表于 2021-5-15 02:14:02 来自手机 | 显示全部楼层
用进程守护不香嘛
发表于 2021-5-15 02:20:46 来自手机 | 显示全部楼层
建议用systemd
 楼主| 发表于 2021-5-18 20:26:43 | 显示全部楼层
G.K.D 发表于 2021-5-15 01:12
你这,在启动进程命令后面,直接再重复一遍上面的检测进程代码不就行了么?(检测刚刚运行的程序进程

还是 ...

感谢大哥,我刚开始学shell,对linux也不大熟。。所以不知道if是这么嵌套的。。
另外想问下大哥,我把 NAMESRV_PID 设置成此脚本的全局变量,在start_namesrv函数中,只有第一遍能引用,当sleep 之后若不在此函数中定义NAMESRV_PID,则第二个if会无法引用此变量,最后导致取到空值,请问这是为何?

求解惑,谢谢~
发表于 2021-5-18 21:30:57 | 显示全部楼层
www61616 发表于 2021-5-18 20:26
感谢大哥,我刚开始学shell,对linux也不大熟。。所以不知道if是这么嵌套的。。
另外想问下大哥,我把 NA ...

SHELL 没有局部变量,每个变量都是全局变量。

你描述的这个情况我看不太明白,你给段代码我看看。
 楼主| 发表于 2021-5-19 15:29:23 | 显示全部楼层
G.K.D 发表于 2021-5-18 21:30
SHELL 没有局部变量,每个变量都是全局变量。

你描述的这个情况我看不太明白,你给段代码我看看。 ...

https://getnote.cf/HmfSt
代码有点长,请看此剪贴板。
在两个start函数中,第二个if前,需要重新获取PID,否则就是空值了
发表于 2021-5-19 16:12:22 | 显示全部楼层
www61616 发表于 2021-5-19 15:29
https://getnote.cf/HmfSt
代码有点长,请看此剪贴板。
在两个start函数中,第二个if前,需要重新获取PID ...
  1. 你理顺一下就知道了。

  2. ┏-- 你先获取进程 PID,
  3. ┠-- 如果 PID 不等于空,就输出进程存在。
  4. ┗┳ 反之如果 PID 等于空,就开始启动进程。
  5.   ┗ 再次获取刚刚启动的进程 PID

  6. 此时,你去读取 ${NAMESRV_PID} 变量,依然获得的是最开始获得的 PID。
  7. 正是因为这个 PID 是空的,所以代码才会执行到这里呀。

  8. 这时候,因为你重新启动了进程,因此就需要重新获取进程 PID。
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2024-4-25 18:55 , Processed in 0.063404 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表