场景
1. 编写一个start.sh脚本,使用jar启动springboot工程
2. 想要启动后,脚本自动退出
3. 最好是判断出启动成功了,再退出
设计
1. 利用nohup实现守护进程和&实现可以退出当前窗口
2. 利用tail -fn --pid 追查文件最新末尾,并且只看新输入的变动(n 0控制的),并且在pid指定的进程完成后,退出tail。
备注:
1. 不使用n 0的话,只用tail -f,会导致先加载文件的内容到末尾,此时如果sed有匹配的内容,就会直接退出了。使用n 0就可以永远只监听最新新输入的变动,从而避免这个情况。
3. 使用sed匹配关键字,并搭配/q,在匹配到内容后退出sed进程。
demo
启动jfqqqq.jar:
#!/bin/sh
echo 'start jfqqq.jar'
nohup java -jar jfqqq.jar --server.port=8888 --logging.level.root=info &
tail -fn 0 --pid=`ps uxh|grep "sed /Started jfqqq in/Q"|grep -v "grep" | awk '{ print $2 } ' | sort -nr | head -1 ` nohup.out|sed '/Started jfqqq in/Q'
echo 'start succeed!'
完成
tips:
1. sed 匹配时,匹配内容使用‘’和不使用‘’号下,空格可以有两种表达:
A. sed '/Started Viewer in/Q'
B. sed /Started[[:space:]]Viewer[[:space:]]in/Q
2. 针对1,grep时,可以不考虑单引号“’”
比如:
tail -fn 0 --pid=`ps uxh|grep "sed /Started Viewer in/Q"|grep -v "grep" | awk '{ print $2 } ' | sort -nr | head -1 ` nohup.out|sed '/Started Viewer in/Q'
里边grep处的sed /Started...就没有写为"sed '/Started",虽然后边的sed命令使用了"'"。
3. echo时,想换行
这三个都无法直接回车:
echo \n--------------- start succeed! ----------------------
echo \\n--------------- start succeed! ----------------------
echo '\n--------------- start succeed! ----------------------'
echo "\n--------------- start succeed! ----------------------"
效果:
这样可以:
echo -e '\n--------------- start succeed! ----------------------'
echo -e "\n--------------- start succeed! ----------------------"