我需要一些帮助来编写一个可以在 AIX 上运行的基本 Unix shell 脚本:
循环将运行 netstat 命令 (netstat -an| grep 16752| grep ESTABLISHED| wc -l),该命令每秒计数会话数,并获取时间戳并将该数据重定向到日志以供审查。如果可能的话,我希望能够以分钟为单位输入它应该运行多长时间。我希望输出非常简单,看起来类似于:
timestamp #count
timestamp #count
答案1
这是一个提示。
date +%s
返回自纪元以来的秒数。由于一分钟有 60 秒,因此您可以轻松进行计算。ksh 和 bash 都允许您使用双括号括住表达式来进行算术运算,如下所示
echo $(( 324567 / 60 ))
答案2
我在 ksh 下测试了这一点,我相信这是 AIX 中使用的 shell。与我对这个问题的评论不同,似乎“until”工作正常。此脚本假设 bc 正在工作;我不确定语法是否$( )
适用于您可能使用的旧 shell,但这是一种赌博,如果没有特定的 /shell 版本信息,它就必须这样做。
用法: thisscript.sh *minutes*
使用多个命令调用脚本分钟它将每秒运行一次命令,直到从计算出的 loop_total 倒计时到零。
除了几条“开始/结束”和持续时间消息外,没有可见的输出。所有内容都通过管道传输到 LOG_FILE。如果您希望输出到屏幕,则可能需要使用变量来存储数据,然后将其输出到 LOG_FILE。干杯。
#!/bin/sh
LOG_FILE="connections.txt"
PORT="16752"
COMMAND="netstat -an | grep ${PORT} | grep ESTABLISHED | wc -l"
TIMESTAMPER="date +'%D %H:%M:%S'" # Format like "mm/dd/yy hh:mm:ss"
if test -z "$1" ; then
echo "ERROR: No duration provided"
exit 1
else
INPUT="$1" # Store the number of minutes wanted
LOOP_TOTAL=$(( ${INPUT} * 60 ))
echo "Started on $( eval ${TIMESTAMPER} )"
echo "Executing for: ${LOOP_TOTAL} seconds (${INPUT} minutes)"
COUNTDOWN=${LOOP_TOTAL} # Initialize counter
until test ${COUNTDOWN} -eq 0 ; do
COUNTDOWN=$(echo "${COUNTDOWN} - 1" | bc)
OUTPUT=$( eval ${COMMAND} )
if test -z "${OUTPUT}"; then
OUTPUT="0" # greps are blank when no connection, so fill out as 0
fi
TIMESTAMP=$( eval ${TIMESTAMPER} )
echo "${TIMESTAMP} #${OUTPUT}"
sleep 1;
done >> ${LOG_FILE}
echo "Finished on $( eval ${TIMESTAMPER} ) "
fi