bash脚本中的条件变量?
我不习惯用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)
#!/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