Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash脚本中的条件变量?_Bash - Fatal编程技术网

bash脚本中的条件变量?

bash脚本中的条件变量?,bash,Bash,我不习惯用bash编写代码,但我在自学。我正在尝试创建一个脚本,该脚本将从进程列表中查询信息。我已经这样做了,但我想更进一步,让它成为: 如果存在操作系统,脚本将使用一组命令运行 如果存在B OS,脚本将使用不同的命令集运行 这是我到目前为止所拥有的。它可以在我的Centos发行版上运行,但不能在我的Ubuntu上运行。非常感谢您的帮助 #!/bin/bash pid=$(ps -eo pmem,pid | sort -nr -k 1 | cut -d " " -f 2 | head -1)

我不习惯用bash编写代码,但我在自学。我正在尝试创建一个脚本,该脚本将从进程列表中查询信息。我已经这样做了,但我想更进一步,让它成为:

  • 如果存在操作系统,脚本将使用一组命令运行
  • 如果存在B OS,脚本将使用不同的命令集运行 这是我到目前为止所拥有的。它可以在我的Centos发行版上运行,但不能在我的Ubuntu上运行。非常感谢您的帮助

    #!/bin/bash
    
    pid=$(ps -eo pmem,pid | sort -nr -k 1 | cut -d " " -f 2 | head -1)
    howmany=$(lsof -l -n -p $pid | wc -l)
    nameofprocess=$(ps -eo pmem,fname | sort -nr -k 1 | cut -d " " -f 2 | head -1)
    percent=$(ps -eo pmem,pid,fname | sort -k 1 -nr | head -1 | cut -d " " -f 1)
    
    lsof -l -n -p $pid > ~/`date "+%Y-%m-%d-%H%M"`.process.log 2>&1
    
    echo " "
    echo "$nameofprocess has $howmany files open, and is using $percent"%" of memory."
    echo "-----------------------------------"
    echo "A log has been created in your home directory"
    echo "-----------------------------------"
    echo " "
    echo ""$USER", do you want to terminate? (y/n)"
    read yn
    case $yn in
    
            [yY] | [yY][Ee][Ss] )
                    kill -15 $pid
                    ;;
    
            [nN] | [n|N][O|o] )
                    echo "Not killing. Powering down."
                    echo "......."
                    sleep 2
                    ;;
            *) echo "Does not compute"
                    ;;
    esac
    

    例如,您可以通过(更新)来实现这一点


    这是我对你剧本的看法。它与Ubuntu和Debian一起工作。在某些方面,它可能比你的更安全(当一个进程占用超过10%的内存时,由于你笨拙的
    剪切
    ,我显然在你的程序中有一个bug)。此外,您的
    ps
    不是“原子的”,因此在
    ps
    的不同调用之间可能会发生变化

    #!/bin/bash
    
    read percent pid nameofprocess < <(ps -eo pmem,pid,fname --sort=-pmem h)
    mapfile -t openfiles < <(lsof -l -n -p $pid)
    howmany=${#openfiles[@]}
    
    printf '%s\n' "${openfiles[@]}" > ~/$(date "+%Y-%m-%d-%H%M.process.log")
    
    cat <<EOF
    
    $nameofprocess has $howmany files open, and is using $percent% of memory.
    -----------------------------------
    A log has been created in your home directory
    -----------------------------------
    
    EOF
    
    read -p "$USER, do you want to terminate? (y/n) "
    
    case $REPLY in
        [yY] | [yY][Ee][Ss] )
                kill -15 $pid
                ;;
    
        [nN] | [n|N][O|o] )
                echo "Not killing. Powering down."
                echo "......."
                sleep 2
                ;;
        *) echo "Does not compute"
                ;;
    esac
    

    在ubuntu下运行这个脚本会有什么错误?与其让脚本以不同的方式处理不同的发行版,不如用可移植的方式编写它。如果可以的话answer@Lorunification的问题,我们可能会建议您更改什么。我只是这样做了:错误:-bash:lsb_release:command not found。假设这些不是lsb兼容的系统。我正在尝试找出如何以另一种通用方式查询操作系统名称。cat/proc/版本和切割不起作用。版本文件位于不同的位置。嗯,一种快速而肮脏的方法是手动创建一个包含分发版的文件。但我相信有一种方法可以优雅地解决这个问题。您是否尝试过以root用户身份运行lsb_发行版?也许它只是不在路径中?请查看两个发行版上的
    uname-a
    的输出,看看这是否允许您识别您在哪个发行版上。如果是这样的话,请更精确地计算出哪个
    uname
    选项提供了有区别的信息。感谢您的回复。我今天将研究你的建议,并让你知道它是如何运作的。现在效果很好。非常感谢你。我想重新发明轮子,但你给了我一个简单得多的方法。非常感谢。
    #!/bin/bash
    
    read percent pid nameofprocess < <(ps -eo pmem,pid,fname --sort=-pmem h)
    mapfile -t openfiles < <(lsof -l -n -p $pid)
    howmany=${#openfiles[@]}
    
    printf '%s\n' "${openfiles[@]}" > ~/$(date "+%Y-%m-%d-%H%M.process.log")
    
    cat <<EOF
    
    $nameofprocess has $howmany files open, and is using $percent% of memory.
    -----------------------------------
    A log has been created in your home directory
    -----------------------------------
    
    EOF
    
    read -p "$USER, do you want to terminate? (y/n) "
    
    case $REPLY in
        [yY] | [yY][Ee][Ss] )
                kill -15 $pid
                ;;
    
        [nN] | [n|N][O|o] )
                echo "Not killing. Powering down."
                echo "......."
                sleep 2
                ;;
        *) echo "Does not compute"
                ;;
    esac
    
    #!/bin/bash
    
    read percent pid nameofprocess < <(ps -eo pmem,pid,fname --sort=-pmem h)
    logfilename="~/$(date "+%Y-%m-%d-%H%M.process.log")
    lsof -l -n -p $pid > "$logfilename"
    howmany=$(wc -l < "$logfilename")
    
    cat <<EOF
    
    $nameofprocess has $howmany files open, and is using $percent% of memory.
    -----------------------------------
    A log has been created in your home directory ($logfilename)
    -----------------------------------
    
    EOF
    
    read -p "$USER, do you want to terminate? (y/n) "
    
    case $REPLY in
        [yY] | [yY][Ee][Ss] )
                kill -15 $pid
                ;;
    
        [nN] | [n|N][O|o] )
                echo "Not killing. Powering down."
                echo "......."
                sleep 2
                ;;
        *) echo "Does not compute"
                ;;
    esac