linux shell脚本下的脚本程序 文件卸载的程序 请高手指点我的程序哪里有错啊?谢谢!

[转]教你在Linux下如何卸载软件
Linux软件的卸载一直是许多新用户的难题。在Windows中,我们可以使用软件自带的安装卸载程序或在控制面板中的“添加/删除程序”来实现。与其相类似,在Linux下有一个功能强大的软件安装卸载工具,名为RPM。它可以用来建立、安装、查询、更新、卸载软件。该工具是在命令行下使用的。在Shell的提示符后输入rpm,就可获得该命令的帮助信息。
软件的安装&
Linux下软件的安装主要有两种不同的形式。第一种安装文件名为xxx.tar.gz;另一种安装文件名为xxx.i386.rpm。以第一种方式发行的软件多为以源码形式发送的;第二种方式则是直接以二进制形式发送的。
对于第一种,安装方法如下:
1.首先,将安装文件拷贝至你的目录中。例如,如果你是以root身份登录上的,就将软件拷贝至/root中。
#cp xxx.tar.gz /root
2.由于该文件是被压缩并打包的,应对其解压缩。命令为:
#tar xvzf filename.tar.gz
3.执行该命令后,安装文件按路径,解压缩在当前目录下。用ls命令可以看到解压缩后的文件。通常在解压缩后产生的文件中,有“Install”的文件。该文件为纯文本文件,详细讲述了该软件包的安装方法。
4.执行解压缩后产生的一个名为configure的可执行脚本程序。它是用于检查系统是否有编译时所需的库,以及库的版本是否满足编译的需要等安装所需要的系统信息。为随后的编译工作做准备。命令为:#./configure。
5.检查通过后,将生成用于编译的MakeFile文件。此时,可以开始进行编译了。编译的过程视软件的规模和计算机性能的不同,所耗费的时间也不同。命令为:#make。
6.成功编译后,键入如下的命令开始安装:
#make install
7.安装完毕,应清除编译过程中产生的临时文件和配置过程中产生的文件。键入如下命令:
#make clean
#make distclean
至此,软件的安装结束。
对于第二种,其安装方法要简单得多。
同第一种方式一样,将安装文件拷贝至你的目录中。然后使用rpm来安装该文件。命令如下:
#rpm -i filename.i386.rpm
rpm将自动将安装文件解包,并将软件安装到缺省的目录下。并将软件的安装信息注册到rpm的数据库中。参数i的作用是使rpm进入安装模式。
软件的卸载&
1.软件的卸载主要是使用rpm来进行的。卸载软件首先要知道软件包在系统中注册的名称。键入命令:
#rpm -q -a
即可查询到当前系统中安装的所有的软件包。
2.确定了要卸载的软件的名称,就可以开始实际卸载该软件了。键入如下命令即可卸载软件:
#rpm -e [package name]
参数e的作用是使rpm进入卸载模式。对名为[package
name]的软件包进行卸载。由于系统中各个软件包之间相互有依赖关系。如果因存在依赖关系而不能卸载,rpm将给予提示并停止卸载。你可以使用如下的命令来忽略依赖关系,直接开始卸载:
#rpm -e [package name] -nodeps
忽略依赖关系的卸载可能会导致系统中其它的一些软件无法使用。
如果是以.bin结尾的二进制软件,可以用以下方法安装(以so-6_0-beta-bin-linux-zh-Tw1.bin为例):
在so-6_0-beta-bin-linux-zh-Tw1.bin所在文件夹下运行模拟终端
./so-6_0-beta-bin-linux-zh-Tw1.bin
并按回车!
当然也可以输入:
./so 再用[Tab]键补全
(./表示当前目录,如果终端不在该软件所在目录下打开,则在软件名前尚需输入相应的路径。)
如果在图形界面,也可直接单击(或双击,视具体的鼠标设置而定)进行安装!
本篇文章来源于 Linux公社网站()&
原文链接:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。Runtime.getRuntime.exec()执行linux脚本导致程序卡死有关问题 -
随笔 - 5, 文章 - 0, 评论 - 0, 引用 - 0
Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题问题:&在Java程序中,通过Runtime.getRuntime().exec()执行一个Linux脚本导致程序被挂住,而在终端上直接执行这个脚本则没有任何问题。原因:&先来看Java代码:&&& public final static void process1(String[] cmdarray) {&&&&&&& Process p =&&&&&&& BufferedReader br =&&&&&&& try {&&&&&&&&&&& p = Runtime.getRuntime().exec(cmdarray);&&&&&&&&&&& br = new BufferedReader(new InputStreamReader(p.getInputStream()));&&&&&&&&&&& String line =&&&&&&&&&&& while ((line = br.readLine()) != null) {&&&&&&&&&&&&&&& System.out.println(line);&&&&&&&&&&& }&&&&&&&&&&& p.waitFor();&&&&&&& } catch (Exception e) {&&&&&&&&&&& e.printStackTrace();&&&&&&& } finally {&&&&&&&&&&& if (br != null) {&&&&&&&&&&&&&&& try {&&&&&&&&&&&&&&&&&&& br.close();&&&&&&&&&&&&&&& } catch (IOException e) {&&&&&&&&&&&&&&&&&&& e.printStackTrace();&&&&&&&&&&&&&&& }&&&&&&&&&&& }&&&&&&&&&&& if (p != null) {&&&&&&&&&&&&&&& p.destroy();&&&&&&&&&&& }&&&&&&& }&&& }脚本内容很简单,主要内容是将一个指定的tar.gz文件解压到指定目录中。程序被挂住后,查看进程列表,发现了几个可疑点:neil@-bash:~/work/tgz$ps ux | grep dowjonesneil& 2079&& 0.0& 0.0& 2435492&&& 264 s001& R+&& 10:56上午&& 0:00.00 egrep dowjonesneil& 2077&& 0.0& 0.0& 2435080&&& 652&& ??& S&&& 10:56上午&& 0:00.24 tar xvf dowjones.tar.gzneil& 2073&& 0.0& 0.0& 2435488&&& 792&& ??& S&&& 10:56上午&& 0:00.00 /bin/bash /Users/neil/bin/genova/genova_crm.sh /Users/neil/work/tgz/dowjones.tar.gz /Users/neil/work/dest/dowj其中genova_crm.sh 就是要执行的脚本,tar xvf dowjones.tar.gz 就是执行解压的命令。可以看到,程序卡在tar命令上,这个命令被挂住了,非常奇怪的事情。。。再次查看JDK文档,发现Process的文档上说标准缓冲区大小有限,不正确操作输入输出流时可能导致程序挂住。单独执行tar xvf dowjones.tar.gz命令时,发现有N多输出,而通过Java执行时,没有看到那些输出。Java程序中只获取了标准输出流,没有获取错误输出流,那么有可能是错误输出缓冲区满而导致tar命令挂住。解决方法:&修改Java程序,标准输出流与错误输出流均要处理,保证输出缓冲区不会被堵住。具体作法是用一个异步线程读取标准输出,读完即扔,让主线程读取错误输出流:&&& public final static void process1(String[] cmdarray) {&&&&&&& try {&&&&&&&&&&& final Process p = Runtime.getRuntime().exec(cmdarray);&&&&&&&&&&& new Thread(new Runnable() {&&&&&&&&&&&&&&& @Override&&&&&&&&&&&&&&& publicvoid run() {&&&&&&&&&&&&&&&&&&& BufferedReader br = new BufferedReader(&&&&&&&&&&&&&&&&&&&&&&&&&&& new InputStreamReader(p.getInputStream()));&&&&&&&&&&&&&&&&&&& try {&&&&&&&&&&&&&&&&&&&&&&& while (br.readLine() != null)&&&&&&&&&&&&&&&&&&&&&&&&&&& ;&&&&&&&&&&&&&&&&&&&&&&& br.close();&&&&&&&&&&&&&&&&&&& } catch (IOException e) {&&&&&&&&&&&&&&&&&&&&&&& e.printStackTrace();&&&&&&&&&&&&&&&&&&& }&&&&&&&&&&&&&&& }&&&&&&&&&&& }).start();&&&&&&&&&&& BufferedReader br =&&&&&&&&&&& br = new BufferedReader(new InputStreamReader(p.getErrorStream()));&&&&&&&&&&& String line =&&&&&&&&&&& while ((line = br.readLine()) != null) {&&&&&&&&&&&&&&& System.out.println(line);&&&&&&&&&&& }&&&&&&&&&&& p.waitFor();&&&&&&&&&&& br.close();&&&&&&&&&&& p.destroy();&&&&&&& } catch (Exception e) {&&&&&&&&&&& e.printStackTrace();&&&&&&& }&&& }重新执行,发现程序可以正常执行了,tar命令的回显被打印出来了。问题解决。这可能跟特定的tar包有关,执行tar解压时,明显可以看到回显字符串中有些乱码,回显全部被输出到错误流了。上述方法可以避免标准输出或错误输出缓冲区满从而挂住主程序的问题,但是需要同时处理两个流,有重复之嫌。如果能把标准输出和错误输出并为一个流,那只需要处理一个流即可。ProcessBuilder提供了这种能力。创建Process有两种方式,一种就是上述的通Runtime.exec来得到,还有一种可以通ProcessBuilder.start()来产生一个Process实例。ProcessBuilder可以先设置必要的参数数据,如命令、环境变量、工作目录、重定向错误流到标准输出,然后start()根据这些参数来生成一个Process实例,启动一个子进程来执行相应的命令。代码如下:&&& public final static void process(String[] cmdarray) throws Throwable {&&&&&&& ProcessBuilder pb = new ProcessBuilder(cmdarray);&&&&&&& pb.redirectErrorStream(true);&&&&&&& Process p =&&&&&&& BufferedReader br =&&&&&&& try {&&&&&&&&&&& p = pb.start();&&&&&&&&&&& br = new BufferedReader(new InputStreamReader(p.getInputStream()));&&&&&&&&&&& String line =&&&&&&&&&&& ("Invoke shell: {}", StringUtils.join(cmdarray, " "));&&&&&&&&&&& while ((line = br.readLine()) != null) {&&&&&&&&&&&&&&& (line);&&&&&&&&&&& }&&&&&&&&&&& p.waitFor();&&&&&&& } finally {&&&&&&&&&&& if (br != null) {&&&&&&&&&&&&&&& br.close();&&&&&&&&&&& }&&&&&&&&&&& if (p != null) {&&&&&&&&&&&&&&& p.destroy();&&&&&&&&&&& }&&&&&&& }&&& }&&& public final static void process(String[] cmdarray) throws Throwable {&&&&&&& ProcessBuilder pb = new ProcessBuilder(cmdarray);&&&&&&& pb.redirectErrorStream(true);&&&&&&& Process p =&&&&&&& BufferedReader br =&&&&&&& try {&&&&&&&&&&& p = pb.start();&&&&&&&&&&& br = new BufferedReader(new InputStreamReader(p.getInputStream()));&&&&&&&&&&& String line =&&&&&&&&&&& ("Invoke shell: {}", StringUtils.join(cmdarray, " "));&&&&&&&&&&& while ((line = br.readLine()) != null) {&&&&&&&&&&&&&&& (line);&&&&&&&&&&& }&&&&&&&&&&& p.waitFor();&&&&&&& } finally {&&&&&&&&&&& if (br != null) {&&&&&&&&&&&&&&& br.close();&&&&&&&&&&& }&&&&&&&&&&& if (p != null) {&&&&&&&&&&&&&&& p.destroy();&&&&&&&&&&& }&&&&&&& }&&& }通过上述代码可以看到,错误流被重定向到标准输出流,那么程序只需要处理标准输出就可以了。
而使用Runtime.getRuntime().exec() 调用外部程序, 获取"标准输出流", 老是阻塞. 在网上找了找, 觉得应该是"错误输出流"的问题. 故为"错误输出流"单开一个线程读取之, "标准输出流"就不再阻塞了。解决过程如下:linux执行自己写的脚本,程序为什么要用 ./ 来执行_百度知道}

我要回帖

更多关于 linux shell脚本 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信