在Linux环境下开发程序经常需要用到一些shell命令,这些是很基础的东西,但是不会的话真的很致命。为了提高开发效率,软件攻城师需要掌握并熟记一部分shell命令。
这里有如下约定:<>内的是说明,具体使用时用实际的命令或语句把<>和它里面的内容全部替换掉。
情景1:有某个库函数或shell命令,你忘记了它的参数或返回该怎么办?
说明:在无法度娘或谷哥的情况下,你需要求助Linux下的好男人man。用法是
man <命令或函数> #(当然你也可以man一下man本身!)
man一般分几卷,如果只想看到函数的说明的话用man 2 <函数名>。 下图例子为man一下find这条命令的说明。
情景2:目标目录底下有一大堆源代码,而你需要快速地找到某个文件中的某一个宏的定义值是多少(这里假设它为MY_MACRO)
grep "MY_MACRO" . -nR
情景3:有个编译命令会打印出一大堆内容,但是你只想看到其中的错误报告信息怎么办?
<编译命令> | grep "error:"
情景4:有一份源代码编译时间非常长(笔者本人就曾经遇到过一份15GBytes的源码),现在要让你编译它,并协助解决其当中的编译错误。
说明:这里有个问题,就是通常我们都是用SSH或Shell去执行编译命令,在终端关闭之后,原来执行的命令就停止了。如何在SSH或Shell终端关闭之后,被执行的编译程序依然在跑,是一个需要解决的问题。
nohup <编译命令> &
然后让机器欢快地跑就可以了,这是机器该干的事情!干完其它事情回来cat或less或more当前目录下自动生成的nohup.out日志记录即可。
情景5:当前的机器被一个不知道哪个捣蛋的家伙跑了一个程序,卡死了,然而你又急着要用。
说明:首先 top 一下,看看哪个程序的CPU占用率最高,然后ps -ef 查找到它的pid值,kill -9 <对应pid> 即可。
情景6:dhcp服务器挂了,你需要设置固定ip地址才能使用网络。
说明:首先修改网络配置文件 sudo vim /etc/network/interfaces
auto lo
iface lo inet loopback
#这段是配置固定ip地址
iface eth0 inet static
address 10.60.3.85
netmask 255.255.255.0
gateway 10.60.3.1
#这段是作为dhcp client的配置
#auto eth0
#iface eth0 inet dhcp
然后重启网络服务即可:
sudo /etc/init.d/networking restart
如果想恢复dhcp模式要操作完以上两步后执行dhcp获取网络地址命令:
sudo dhclient eth0
情景7:如何查看应用程序依赖库。
说明:查看可执行程序的依赖库共有两种办法。
第一种是使用ldd命令,下图为使用ldd命令查看awk程序的依赖库。
不推荐为任何不可信的第三方可执行程序运行ldd,因为某些版本的ldd可能会直接调用可执行程序来明确其库文件依赖关系,这样可能不安全。
第二种是相对比较安全的方法,使用objdump命令。
objdump -p <应用程序路径> | grep NEEDED
情景8:那么,正在运行的进程的依赖库如何查看呢?
sudo pldd <PID> # 网上有人说用这个,显示出在运行时被载入一个进程里的所有共享对象,反正我是没实验出来...
sudo pmap <PID>
# 使用pmap工具报告一个进程的内存映射,同时也能显示出运行进程的库文件依赖
情景9:查看应用程序是32位还是64位的 (如果在32位系统中跑64位的应用程序,可能会出错)
说明:笔者就曾经遇到过一份从64位环境下拷贝到32位环境的源代码,编译了几个小时之后,异常中止。追查了半天的原因,最后发现这份代码中间有个打包工具是在64位环境下编译出来的,在32位操作系统中运行不了,导致了整个编译的失败。
file <目标程序>
情景10: 如何批量修改某个目录底下所有文件和子文件夹中文件的时间戳?
说明:这个场景也是经常会遇到的,由于Linux底下的Make工具是通过时间戳来执行编译操作的。如果一个源文件的时间戳比较旧,在make增量编译过程中通常会没编进去。这里就需要修改这些文件的时间戳了。
touch <目标文件名> #修改单个文件使用touch命令,相信大家都懂...
find <目标路径> * -exec touch {} \; #修改某个路径底下的全部文件和子文件夹的文件,就需要这个...
这里需要使用到find命令的组合。
-exec参数是表示命令组合,把find命令的输出作为某条命令的输入,-exec的结束以分号";"为标志。
{}表示find命令查找到的文件名。