它的目的是启动,停止和重新启动服务器.这是非常标准的东西,所以值得花一些时间来理解它.我评论了那些我不确定其含义或我完全不理解的那些内容,希望somone可以给我一些解释.
#!/bin/bash # BASE=/tmp PID=$BASE/app.pID LOG=$BASE/app.log ERROR=$BASE/app-error.log PORT=11211 ListEN_IP='0.0.0.0' MEM_SIZE=4 CMD='memcached'# Does this mean,that the COMMAND variable can adopt different values,depending on# what is entered as parameter? "memcached" is chosen by default,port,ip address and # memory size are options,but what is -v? COMMAND="$CMD -p $PORT -l $ListEN_IP -m $MEM_SIZE -v" USR=user status() { echo echo "==== Status" if [ -f $PID ] then echo echo "PID file: $( cat $PID ) [$PID]" echo# ps -ef: display uID,pID,parent pID,recent cpu usage,process start time,# controling tty,elapsed cpu usage,and the associated command of all other processes# that are owned by other users.# The rest of this line I don't understand,especially grep -v grep ps -ef | grep -v grep | grep $( cat $PID ) else echo echo "No PID file" fi } start() { if [ -f $PID ] then echo echo "Already started. PID: [$( cat $PID )]" else echo "==== Start"# Lock file that indicates that no 2nd instance should be started touch $PID# COMMAND is called as background process and ignores SIGHUP signal,writes it's# output to the LOG file. if nohup $COMMAND >>$LOG 2>&1 &# The pID of the last background is saved in the PID file then echo $! >$PID echo "Done." echo "$(date '+%Y-%m-%d %X'): START" >>$LOG else echo "Error... " /bin/rm $PID fi fi }# I don't understand this function :-( kill_cmd() { SIGNAL=""; MSG="Killing " while true do List=`ps -ef | grep -v grep | grep $CMD | grep -w $USR | awk '{print }'` if [ "$List" ] then echo; echo "$MSG $List" ; echo echo $List | xargs kill $SIGNAL# Why this sleep command? sleep 2 SIGNAL="-9" ; MSG="Killing $SIGNAL" if [ -f $PID ] then /bin/rm $PID fi else echo; echo "All killed..." ; echo break fi done } stop() { echo "==== Stop" if [ -f $PID ] then if kill $( cat $PID ) then echo "Done." echo "$(date '+%Y-%m-%d %X'): Stop" >>$LOG fi /bin/rm $PID kill_cmd else echo "No pID file. Already stopped?" fi } case "" in 'start') start ;; 'stop') stop ;; 'restart') stop ; echo "SleePing..."; sleep 1 ; start ;; 'status') status ;; *) echo echo "Usage: { start | stop | restart | status }" echo exit 1 ;; esac exit 0解决方法 1)
COMMAND =“$CMD -p $PORT -l $ListEN_IP -m $MEM_SIZE -v” – 在Unix传统中的-v通常是–verbose的快捷方式.所有这些美元符号都是可变扩展(它们的文本值被插入分配给新变量COMMAND的字符串中).
2)
ps -ef | grep -v grep | grep $(cat $PID) – 它是一个管道:ps将其输出重定向到grep,输出到另一个grep,最终结果打印到标准输出.
grep -v grep的意思是“占用所有不包含’grep’的行”(grep本身就是一个进程,所以你需要将它从ps的输出中排除). $($command)是一种运行命令并将其标准输出插入此脚本位置的方法(在这种情况下:cat $PID将显示名为$PID的文件内容).
3)kill_cmd.
这个函数是一个无限循环试图杀死’memcached’进程的PID的List.首先,它尝试发送TERM信号(礼貌地要求$List中的每个进程退出,保存其工作并正确关闭),给他们2秒(睡眠2)来完成他们的关机工作,然后尝试确保所有进程使用信号KILL(-9)杀死,它使用 *** 作系统设施立即杀死进程:如果进程在2秒内没有完成其关闭工作,则认为是挂起的).如果使用kill -9进行杀戮成功,则会删除PID文件并退出循环.
ps -ef | grep -v grep | grep $CMD | grep -w $USR | awk'{print $2}’打印名为$CMD(‘memcached’)和user $USR(‘user’)的进程的所有PID. grep的-w选项意味着“仅限整个单词”(这不包括所寻求的名称是另一个进程名称的一部分的情况,如’fakememcached’). awk是一个小解释器,最常用于从每行输入中取一个单词数字N(您可以将其视为文本表的一列的选择器).在这种情况下,它会在ps输出行中打印每个第二个字,这意味着每个PID.
如果您有任何其他问题,我将在下面添加答案.
总结以上是内存溢出为你收集整理的linux – start-stop-restart shell脚本的功能全部内容,希望文章能够帮你解决linux – start-stop-restart shell脚本的功能所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)