在Linux中curl时,如果http请求有参数时,一定要在&前加个\
sudo到root后,如果找不到java_home变量,则. /etc/profile即可
启动脚本
#!/bin/sh
BASEDIR=`dirname $0`/..
BASEDIR=`(cd "$BASEDIR"; pwd)`
LOGDIR="$BASEDIR/log/"
PIDPROC=`ps -ef | grep 'App.war' | grep -v 'grep'| awk '{print $2}'`
if [ -z "$PIDPROC" ];then
#check JAVA_HOME & java
noJavaHome=false
if [ -z "$JAVA_HOME" ] ; then
noJavaHome=true
fi
if [ ! -e "$JAVA_HOME/bin/java" ] ; then
noJavaHome=true
fi
if $noJavaHome ; then
echo
echo "Error: JAVA_HOME environment variable is not set."
echo
exit 1
fi
if [ -z "$OPTS_MEMORY" ] ; then
OPTS_MEMORY="-XX:+UseG1GC -XX:G1ReservePercent=10 -XX:MaxGCPauseMillis=50 -Xms8G -Xmx8G"
fi
RUN_CMD="$JAVA_HOME/bin/java"
nohup $RUN_CMD -jar $OPTS_MEMORY -Dtag.log.dir="${LOGDIR}" ../App.war "$@" >/dev/null 2>/dev/null &
echo "App started"
else
echo "App(pid:$PIDPROC) is running"
fi
停止脚本
#!/bin/sh
PIDPROC=`ps -ef | grep 'App.war' | grep -v 'grep'| awk '{print $2}'`
if [ -z "$PIDPROC" ];then
echo "App is not running"
exit 0
fi
echo "PIDPROC: "$PIDPROC
for PID in $PIDPROC
do
if kill -15 $PID
then echo "process App(Pid:$PID) was force stopped at " `date`
fi
done
echo stop finished.
1、关于awk命令的面试题
(1)最近登录的5个帐号
last -n 5 | awk -F ':'(指定域分割符号) '{print $1}'
-n表示number,有多少行需要显示。读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键" 或 "[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。
(2)用awk统计文本行数
awk '{count++} END{print "user count is ", count}' /etc/passwd
awk 'END{print "user count is " NR}' filename
或者直接wc -l 文件名也可以
grep -o '此设备id在黑名单之内' jr-adx-dsp_dspbidding.log.20170626* | wc -l
还有很多其它的,如:
(3)Test内容如下:
zhangsan 80
lisi 81.5
wangwu 93
zhangsan 85
lisi 88
wangwu 97
zhangsan 90
lisi 92
wangwu 88
要求输出格式:
name#######average#######total
zhangsan xxx xxx
lisi xxx xxx
wangwu xxx xxx
其中average为平均成绩,而total为总成绩
awk '{a[$1]+=$2;b[$1]++};END{for(i in a)print i,a[i]/b[i],a[i]}' test.txt
居然能用$1来当数据索引。
(4)这个文件夹里面每一层级都有个.svn隐藏文件夹,需要删除,使用如下命令:
$find . -type d -name "*.svn" | xargs rm -rf
(5)统计以p开始的行的个数:
find -name test.sh -type f -print|xargs awk '/^p/{count++}END{print count}'
使用了xargs,将找到的文件名做为参数传递给awk命令,如果输出的是一行行内容,就没有必要加xargs了,如下:
$cat a.txt |awk '{print $2}'
(6)提取文件中含有"apa"的单词并输出到一个文件中
find . -name "*.txt"|xargs grep -oE "[a-zA-Z]*apa[a-zA-Z]*"|awk -F: '{print $2}'
sed 命令可以很好的进行行匹配,但从某一行中精确匹配某些内容,则使用 grep 命令并辅以 -o 和 -E 选项可达到此目的。其中 -o 表示“only-matching”,即“仅匹配”之意。光用它不够,配合 -E 选项使用扩展正则表达式则威力巨大。
参考:
2、编写一个简单的Shell脚本
查找/root/目录下是否存在该文件
#/bin/bash // 以bash shell来解释
echo "enter a file name:"
read a // 读取用户输入的信息并向右侧变量分配用户输入的值
if test -e /root/$a // test检查文件和比较值,注意变量引用时用$
then echo "the file is exist!"
else echo "the file is not exist!"
fi
if/else条件的格式如下:
if[表达式]
then
命令语句块
else
命令语句块
fi
必读文章:
3、Linux系统监控命令
(1)top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。
(2)ps命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
(3)jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
(4)pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。
(5)磁盘使用情况:iostat
具体可以参看文章:
4、线上CPU100%,如何定位和排查问题
(1)
1.jps 获取Java进程的PID
2.jstack pid >> java.txt 导出CPU占用高进程的线程栈
3.top -H -p PID 查看对应进程的哪个线程占用CPU过高
4.echo “obase=16; PID” | bc 将线程的PID转换为16进制,大写转换为小写
5.在第二步导出的Java.txt中查找转换成为16进制的线程PID。找到对应的线程栈,分析负载高的线程栈都是什么业务操作。优化程序并处理问题。
(2)
1.使用top 定位到占用CPU高的进程PID,并查看进程具体信息
top // 命令获取进程相关的信息,并找到占用CPU高的线程
ps aux | grep PID // 得到PID进程的具体信息,比如是个Tomcat服务进程
2、获取线程相关信息
ps -mp pid -o THREAD,tid,time | sort -rn
ps命令的几个参数:
-m显示所有的线程
-p pid进程使用cpu的时间
-o 用户自定义格式
tid 线程id
sort命令的两个参数:
-n 依照数值的大小排序
-r 以相反的顺序来排序
3.将需要的线程ID转换为16进制格式
printf "%x\n" tid
4.打印线程的堆栈信息
jstack pid |grep tid -A 30
-A 30 匹配行的后30行内容
(4)
#!/bin/sh
ts=$(date +"%s")
jvmPid=$1
defaultLines=100
defaultTop=20
threadStackLines=${2:-$defaultLines}
topThreads=${3:-$defaultTop}
jvmCapture=$(top -b -n1 | grep java )
threadsTopCapture=$(top -b -n1 -H | grep java )
jstackOutput=$(echo "$(jstack $jvmPid )" )
topOutput=$(echo "$(echo "$threadsTopCapture" | head -n $topThreads | perl -pe 's/\e\[?.*?[\@-~] ?//g' | awk '{gsub(/^ +/,"");print}' | awk '{gsub(/ +|[+-]/," ");print}' | cut -d " " -f 1,9 )\n ")
echo "*************************************************************************************************************"
uptime
echo "Analyzing top $topThreads threads"
echo "*************************************************************************************************************"
printf %s "$topOutput" | while IFS= read line
do
pid=$(echo $line | cut -d " " -f 1)
hexapid=$(printf "%x" $pid)
cpu=$(echo $line | cut -d " " -f 2)
echo -n $cpu"% [$pid] "
echo "$jstackOutput" | grep "tid.*0x$hexapid " -A $threadStackLines | sed -n -e '/0x'$hexapid'/,/tid/ p' | head -n -1
echo "\n"
done
echo "\n"
tailf、tail -f、tail -F三者区别
tail -f 等同于--follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止
tail -F 等同于--follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
tailf 等同于tail -f -n 10(貌似tail -f或-F默认也是打印最后10行,然后追踪文件),与tail -f不同的是,如果文件不增长,它不会去访问磁盘文件,所以tailf特别适合那些便携机上跟踪日志文件,因为它减少了磁盘访问,可以省电
查看对应服务器版本当前操作系统发行版信息: cat /etc/issue 或 cat /etc/redhat-release
查看更为底层的版本信息: cat /proc/version (例如:CentOS实际最根源为RetHat,此命令将会显示所采用RetHat的版本)
统计系统的核数:cat /proc/cpuinfo | grep "model name" | wc -l
JAVA_HOME=/usr/java/jdk1.7.0_55
CLASSPATH=.:$JAVA_HOME/lib.tools.jar
PATH=$JAVA_HOME/bin:$PATH
export JAVA_HOME CLASSPATH PATH
Linux下查看进程打开的文件句柄数
---查看系统默认的最大文件句柄数,系统默认是1024
# ulimit -n
1024
----查看当前进程打开了多少句柄数
# lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
131 24204
57 24244
57 24231 ........
其中第一列是打开的句柄数,第二列是进程ID。
可以根据ID号来查看进程名。
# ps aef|grep 24204
nginx 24204 24162 99 16:15 ? 00:24:25 /usr/local/nginx/sbin/nginx -s