linux shell脚本对未定义变量的判断以及if的用法
发布日期:2021-05-07 04:26:15 浏览次数:24 分类:精选文章

本文共 1586 字,大约阅读时间需要 5 分钟。

Shell脚本优化:自动化进程杀死与程序启动

背景

在实际工作中,经常需要处理程序的进程管理问题。例如,某些脚本程序在启动前需要确保没有其他进程占用资源,或者需要清理掉之前的进程占用。以下是一个典型的场景:

公司有一款名为“ggjob-search”的程序,它需要通过脚本自动化启动。每次启动前,需要先查找当前运行的进程ID(PID),然后杀死对应的进程,最后启动新的程序实例。

问题描述

每次手动操作会非常繁琐:

  • 需要查找进程ID
  • 需要手动杀死进程
  • 需要启动新的程序
  • 这种繁琐的操作容易出错,且随着时间的推移,操作的复杂性只会增加。

    解决方案

    通过Shell脚本实现自动化处理,解决上述问题。以下是优化后的脚本代码:

    #!/bin/bash
    echo "ggjob-search..."
    pid=$(ps -ef | grep -w ggjob-search | grep -v grep | grep -v ggjob-search.sh | awk '{printf $2}')
    echo "having kill pid:$pid"
    # 判断进程是否存在
    if [ -z "$pid" ]; then
    echo "pid variable is not set or undefined"
    exit 1
    else
    kill -9 $pid
    fi
    # 后台启动程序
    nohup java -Djava.ext.dirs=lib -Xms500m -Xmx500m -Dlog4j.configuration=file:/home/webuser/gogoal_platform/ggjob/config/log4j.properties -jar ggjob-search.jar config/config.properties 2>&1 >> /dev/null & echo "new pid:$!"

    解释

  • 脚本开头:声明脚本的解释性说明,确保脚本的可读性。

  • 查找进程ID

    • 使用ps -ef命令获取正在运行的进程列表。
    • 使用grep -w ggjob-search过滤出与“ggjob-search”相关的进程。
    • 使用grep -v grep排除grep命令本身的进程。
    • 使用grep -v ggjob-search.sh排除脚本本身临时启动的进程。
    • 使用awk '{printf $2}'提取进程ID并赋值给变量pid
  • 判断变量是否存在

    • 使用if [ -z "$pid" ]判断pid变量是否为空。
    • 如果pid为空,提示用户“pid变量不为空”并退出脚本。
    • 如果pid存在,执行kill -9 $pid命令,强制终止对应的进程。
  • 后台启动程序

    • 使用nohup命令将输出重定向到/dev/null,避免输出到终端。
    • 使用>> /dev/null &将启动结果的错误信息也重定向到/dev/null
    • 最后使用echo "new pid:$!"打印新的进程ID。
  • 优化点

  • 简化条件判断

    • 使用[ -z "$pid" ]来判断pid是否为空,简洁且直观。
    • 如果pid未定义,直接退出脚本,避免后续命令无法执行。
  • 错误处理

    • pid未定义时,脚本会立即退出,避免因未定义变量导致错误。
    • 使用exit 1确保脚本在遇到问题时能够优雅退出。
  • 脚本可读性

    • 注释清晰,代码结构分明,便于阅读和理解。
    • 每个步骤都有明确的注释,方便后续维护和修改。
  • 实际应用

    在实际使用中,可以根据具体需求调整以下内容:

  • 进程过滤规则:根据实际场景调整grep过滤条件。
  • 运行参数:根据实际需求调整Java启动命令。
  • 后台启动方式:可以根据实际需求选择不同的后台启动方式。
  • 通过上述优化,脚本的执行效率得到了显著提升,减少了人为错误,且代码结构更加清晰易读。

    上一篇:修改jenkins主目录与cp参数a使用
    下一篇:centos7中根据文件大小排序以及jenkins配置每周删除一次jobs日志信息

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月23日 05时34分35秒