linux shell 编程 12 特殊符号 “&” 以及和他的恩怨
时间:2016-06-12 23:39 来源:linux.it.net.cn 作者:IT
这篇文章中主要说说这四个符号: &、&& 、$!、$$ 四个符号。
符号解释:
&&: 逻辑关系 与
& : 在后台运行进程
$! : 是最后运行的后台Process的PID
$$:是脚本运行的当前进程ID号
为什么要在这里说这些符号那,有三个不是在之前已经学习过了吗,原因有一、获取程序的pid
下面我们就看看 这几个符号:
在之前的文章中获取pid 的方式就是如下两种
1、如果是使用ps 命令来查看pid 则: ps -ef | grep -v 'grep' | grep 'Java' | awk '{print $2}'
这个命令就是获取java 这个程序的pid,因为使用ps 命令第一列输出的是user 第二列输出的是 pid 所以就这样我们能获取这个程序的pid
2、如果是按照端口号来查看pid的则: netstat -anp | grep 8080 | awk '{print $7}' | awk '{split($0,b,"/");print b[1]}'
这个命令就是获取8080 这个端口号的程序的pid ,因为使用netstat 输出的列数的第七列有程序名称和pid 而他们之间是使用“/” 来隔开的,所以使用了 awk 编程命令的split 来获取数组 在获取数组中的值,这样就获得了pid
3、但总是感觉这种方式有点不舒服,感觉代码写的很死,不健壮如果输出的列有变化则就获取不到了。所以我们可以这种方式来试试,那就是 $! 和 & ,通过上面的介绍我们也知道,$! 就是最后运行的process的pid 而 & 是表示在后台执行进程,这样我们就可以使用一个命令来获取程序的pid了
4、简单实例,获取pid
-
#!/bin/bash
-
java hello & echo $! >/usr/src/run.pid
这个脚本很简单,就是运行hello这个java程序, 之后的应该能猜到了,就是获取运行 这个java 的进程pid 在将他重定向到run.pid 这个目录下。
获取这个文件中pid : $(cat /usr/src/run.pid) 或使用反引号 ` cat /usr/src/run.pid`
这样我们就能从这个文件中读取之前保存的pid了,获取之后我们可以使用: ps -p $pid | grep 'name' 来获取这个程序是否执行的信息。
5、附上正式脚本
-
#!/bin/bash
-
-
basepath=/www/homepage
-
-
PATH=$PATH:$HOME/bin:/usr/local/mysql/lib/mysql/
-
-
JAVA_HOME=/usr/java/jdk
-
ANT_HOME=/usr/java/ant
-
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/usr/local/resin/lib/jsdk23.jar
-
PATH=$JAVA_HOME/bin:$ANT_HOME/bin:$PATH
-
export JAVA_HOME CLASSPATH ANT_HOME PATH
-
-
LANG=zh_CN
-
export LANG
-
cd $basepath/WebRoot/WEB-INF/classes
-
PID=`cat /www/homepage/1minute.pid`
-
content=`ps -p $PID -f |grep DumpFileByMultThread`
-
if [ "$content" != "" ]; then
-
kill -9 $PID
-
echo "$PID is killed"
-
fi
-
java -classpath .:$basepath/WebRoot/WEB-INF/lib/commons-httpclient-3.0.jar:$basepath/WebRoot/WEB-INF/lib/log4j-1.2.11.jar:$basepath/WebRoot/WEB-INF/lib/commons-logging-1.0.4.jar:$basepath/WebRoot/WEB-INF/lib/commons-codec-1.3.jar:$basepath/WebRoot/WEB-INF/lib/commons-net-1.4.1.jar:$basepath/WebRoot/WEB-INF/lib/jakarta-oro.jar com.soufun.fetch.DumpFileByMultThread $basepath/src/com/soufun/fetch/1minute.txt & echo $! > /www/homepage/1minute.pid
-
~
注: 这里有个问题 &$! > filenae 这个写在java启动脚本中没问题,但是写在启动tomcat的脚本中不报错 但是获取的那个pid 压根就找不到对应的进程。
上面脚本中主要的地方分析如下:
(1)、使用反引号`` 或者 $() 来执行命令 cat /www/homepage/1minute.pdi 从这个文件中获取pid
(2)、使用 ps -p $pid -f | grem "name" 获取指定pid下的指定的进程名称的进程信息。注意这里不加 -f 的话就获取不到进程名称,-f 是全名称展示
(3)、如果进程存在则可以获取相关信息,如果不存在则获取不到信息,信息为空
(4)、如果信息不为空的,说明进程在执行, 使用kill -9 $pid 强制杀死进程以及子进程
6、 附带四个符号:
>、>!、>> 、 < 、这四个符号
> 输出重定向到一个文件或设备 覆盖原来的文件
>! 输出重定向到一个文件或设备 强制覆盖原来的文件
>> 输出重定向到一个文件或设备 追加原来的文件
< 输入重定向到一个程序
(责任编辑:IT)
这篇文章中主要说说这四个符号: &、&& 、$!、$$ 四个符号。 符号解释: &&: 逻辑关系 与 & : 在后台运行进程 $! : 是最后运行的后台Process的PID $$:是脚本运行的当前进程ID号 为什么要在这里说这些符号那,有三个不是在之前已经学习过了吗,原因有一、获取程序的pid 下面我们就看看 这几个符号: 在之前的文章中获取pid 的方式就是如下两种 1、如果是使用ps 命令来查看pid 则: ps -ef | grep -v 'grep' | grep 'Java' | awk '{print $2}' 这个命令就是获取java 这个程序的pid,因为使用ps 命令第一列输出的是user 第二列输出的是 pid 所以就这样我们能获取这个程序的pid 2、如果是按照端口号来查看pid的则: netstat -anp | grep 8080 | awk '{print $7}' | awk '{split($0,b,"/");print b[1]}' 这个命令就是获取8080 这个端口号的程序的pid ,因为使用netstat 输出的列数的第七列有程序名称和pid 而他们之间是使用“/” 来隔开的,所以使用了 awk 编程命令的split 来获取数组 在获取数组中的值,这样就获得了pid
3、但总是感觉这种方式有点不舒服,感觉代码写的很死,不健壮如果输出的列有变化则就获取不到了。所以我们可以这种方式来试试,那就是 $! 和 & ,通过上面的介绍我们也知道,$! 就是最后运行的process的pid 而 & 是表示在后台执行进程,这样我们就可以使用一个命令来获取程序的pid了 4、简单实例,获取pid
这个脚本很简单,就是运行hello这个java程序, 之后的应该能猜到了,就是获取运行 这个java 的进程pid 在将他重定向到run.pid 这个目录下。 获取这个文件中pid : $(cat /usr/src/run.pid) 或使用反引号 ` cat /usr/src/run.pid`
这样我们就能从这个文件中读取之前保存的pid了,获取之后我们可以使用: ps -p $pid | grep 'name' 来获取这个程序是否执行的信息。
注: 这里有个问题 &$! > filenae 这个写在java启动脚本中没问题,但是写在启动tomcat的脚本中不报错 但是获取的那个pid 压根就找不到对应的进程。 上面脚本中主要的地方分析如下: (1)、使用反引号`` 或者 $() 来执行命令 cat /www/homepage/1minute.pdi 从这个文件中获取pid (2)、使用 ps -p $pid -f | grem "name" 获取指定pid下的指定的进程名称的进程信息。注意这里不加 -f 的话就获取不到进程名称,-f 是全名称展示 (3)、如果进程存在则可以获取相关信息,如果不存在则获取不到信息,信息为空 (4)、如果信息不为空的,说明进程在执行, 使用kill -9 $pid 强制杀死进程以及子进程 6、 附带四个符号: >、>!、>> 、 < 、这四个符号
> 输出重定向到一个文件或设备 覆盖原来的文件 (责任编辑:IT) |