① linux 下如何发送带附件的邮件
如果这两个都不能用,那么可以用 mail命令。如果你能确认你的邮件服务器支持 8-bit 的字节, 可以直接用 cat <附件文件名 | mail <邮件地址 不过很多邮件服务器不支持 8-bit 字节,所以最好使用 uuencode 命令。先写好邮件, 比如叫 mymail, 然后uuencode <附件文件名 <附件文件名 mymail 或者cat <附件文件名 | uuencode <附件文件名 mymail 然后编辑你的 mymail 文件, 在前面写上信的正文。 然后寄出。收到信后, 把信中属于 mymail 的部分拷贝出来, 存为 themail.uue。如果对方是在 windows 下, 就可以用 winzip 7.0 解压, 即可得到附件。
如果对方在 linux 下, 可以用 uudecode 还原:uudecode -o <附件文件名 themail.uue cat <附件文件名 | mail <邮件地址 如果有多个文件要处理, 那么就重复执行上述步骤, 不过这样收到邮件后对每个邮件需要分别处理。当然压缩一下会得到更好的效果, 这样邮件长度会大大降低。 附件文件名就是压缩后的文件名。 老大,这样不是很麻烦,有没有像这样的 mail -s hello -xx /tmp/ss.exe [email protected] 没有 用pine,很简单的. 一般redhat都带. way1: uuencode file1 file1 | mail -s "title" mail@address way2: mutt -s "title" -a /dir/file1 mail@address 上面的方法2会启动编辑器来写正文,也可以先编辑好邮件内容,mailcontent.txt # cat mailcontent.txt | mutt -s "title" -a attachfile1 mail@address 就不会启动编辑器了。 way1: uuencode file1 file1 | mail -s "title" mail@address 执行此命令后没很久都没有反应, way2: mutt -s "title" -a /dir/file1 mail@address 系统中没有mutt这个东东,我的是bsd4.7 uuencode file1 file1 | mail -s "asdf" [email protected] 没反应? 是不是你的file1太大啦?编码要很久? 我也是从人家那里学到的,而且成功地发送了不下一百封信。
② linux如何设置程序开机启动后台运行
有些时候,我们需要在终端启动一个程序,并使之运行——但是如果关闭终端,那么这个程序也就随着关闭了。那么有没有什么方法在关闭终端后,让已经从这个终端启动的程序继续运行呢?有以下方法
1.让linux忽略终端的hung up 信号,不关闭进程;
2.让此进程变为终端的非子进程。
方法一:
在终端输入命令:
# ./pso > pso.file 2>&1 &
解释:将pso直接放在后台运行,并把终端输出存放在当前目录下的pso.file文件中。
当客户端关机后重新登陆服务器后,直接查看pso.file文件就可看执行结果(命
令:#cat pso.file )。
或者 在终端输入命令:
# nohup ./pso > pso.file 2>&1 &
解释:nohup就是不挂起的意思,将pso直接放在后台运行,并把终端输出存放在当前
目录下的pso.file文件中。当客户端关机后重新登陆服务器后,直接查看pso.file
文件就可看执行结果(命令:#cat pso.file )。
方法二:
实现方案就是nohup命令。
例如要启动jboss,可以nohup ./run.sh &。这样就可以了,结尾的“&”符号表示后台启动jboss,从而不影响继续运行其他命令。
但这样有一个问题,nohup命令虽然可以让linux“放过”这个进程,但是nohup会同时把进程的控制台输出重定向到nohup.txt下(默认是这个文件),当然可以重定向为其他的文件,但是输出总会有的。
如果jboss运行很长时间,而且如果有很多控制台输出的话,nohup.txt文件就会变的很大很大。
通常项目中的日志都会输出到特定的日志文件或者输出到 数据库 中,也就是说控制台的输出对于程序的意义不大,那么可不可以抛弃掉这些输出呢?答案是肯定的。
这里讲解一下linux的重定向(注意,是linux的重定向,不是针对nohup)。
0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出。
在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号。例如,将某个程序的错误信息输出到log文件中:./program 2>log。这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。
另外,也可以实现0,1,2之间的重定向。2>&1:将错误信息重定向到标准输出。
Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。
结合nohup,我们可以这样 nohup ./run.sh >/dev/null &
这是最简单的一种方式,既保证了程序能够一直后台执行,又能保证不会产生太大的nohup.txt文件。
方法三:
利用的linux的一个机制,让程序在subshell中执行,方法很简单,将命令用括号() 括起来即可。
ps -ef | grep test
可以看到run.sh的父进程为1,不是当前终端了,这样就能忽略hung up信号。
当然linux还可以动态的让程序后台运行或不被hung up 信号关闭,例如disown命令,setid命令等。
方法四:
如果是使用Ubuntu的话,你可以利用CTRL+ALT+T组合键打开终端。当然你也可以使用超级键(Windows键)打开Dash,搜索“TERM”,然后点击“Term”图标来打开终端窗口。
对于其他的桌面环境来说,例如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜单中找到终端。有些环境会在停靠栏或者面板上面包含终端图标。
通常情况下,你可以在终端里面直接输入应用程序名来启动一个应用程序。比如说,你可以通过输入“firefox”来启动Firefox。
在终端启动应用程序的好处是,你可以包含一些额外的参数。
例如,你可以通过下列命令来打开一个Firefox浏览窗口,然后利用默认的搜索引擎搜索相关信息:
firefox -search "linux.cn"
你可能会注意到,如果你启动Firefox,程序打开以后,回到了终端窗口控制,这就意味着你可以继续在终端进行工作。
通常情况下,如果你在终端启动了应用程序,控制会切换到新启动的应用程序,只有程序被关闭以后才会重新切换到终端控制。这是因为你在前台启动了这个程序。
如果要在Linux终端打开应用程序并且返回终端控制,那么你需要将应用程序启动为后台进程。
和下面所列的命令一样,我们可以通过增加一个(&)符号,将应用程序在后台启动。
libreoffice &
译者注:如果需要加参数的话,记得把&符号放在最后。
译者注:一般情况下,关闭终端时,在这个终端启动的后台程序也会被终止,要使终端关闭以后,后台程序依然保持执行可以使用下列命令
nohup command [arg...] &
如果应用程序目录没有安装在PATH变量包含的目录里面的话,我们就没有办法直接通过应用程序名来启动程序,必须输入应用程序的整个路径来启动它。
/path/to/yourprogram &
如果你不确定程序输入哪个Linux目录结构的话,可以使用find或者location命令来定位它。
可以输入下列符号来找到一个文件:
find /path/to/start/from -name programname
例如,你可以输入下列命令来找到Firefox:
find / -name firefox
命令运行的结果会嗖的一下输出一大堆,别担心,你也可以通过less或者more来进行分页查看。
find / -name firefox | more find / -name firefox | less
当find命令查找到没有权限访问的文件夹时,会报出一条拒绝访问错误,
你可以通过sudo命令来提示权限。当然,如果你没有安装sudo的话,就只能切换到一个拥有权限的用户了。
sudo find / -name firefox | more
如果你知道你要查找的文件在你的当前目录结构中,那么你可以使用点来代替斜杠:
sudo find . -name firefox | more
你可能需要sudo来提升权限,也可能根本就不需要,如果这个文件在你的主目录里面,那么就不需要使用sudo。
有些应用程序则必须要提升权限才能运行,否则你就会得到一大堆拒绝访问错误,除非你使用一个具有权限的用户或者使用sudo提升权限。
这里有个小窍门。如果你运行了一个程序,但是它需要提升权限来操作,输入下面命令试试:
sudo !!
方法五:
在Unix/Linux下如果想让程序独立终端运行,一般都是使用 & 在命令结尾来让程序自动运行。(命令后可以不追加空格)
打开gnome-terminal,执行如下命令:
delectate@delectate:~$ totem &[1] 8510delectate@delectate:~$ 有几点需要注意:
已经启动的程序依然attach于当前pts,只有当前终端模拟器关闭(使用exit命令退出),进程自动被tty继承。delectate@delectate:~$ ps -e | grep totem //程序已被以totem & 形式启动,当前附在pts0上8819 pts/0 00:00:00 totemdelectate@delectate:~$ ps -e | grep totem //pts0的模拟终端被exit命令关闭,totem自动附在tty8819 ? 00:00:00 totemdelectate@delectate:~$
具有debug输出的进程,需要按enter键进行中断当前debug输出。但是如果程序持续进行printf,你将无法输入任何命令。delectate@delectate:~$ vlc &[1] 8850delectate@delectate:~$ VLC media player 1.0.6 Goldeneye[0x8b998b0] main libvlc: Running vlc with the default interface. Use ‘cvlc’ to use vlc without interface. //enter presseddelectate@delectate:~$ //show a clean terminal now** (:8850): CRITICAL **: giop_thread_request_push: assertion `tdata != NULL’ failed //仍然在输出数据…… //关闭程序[1]+ Done vlcdelectate@delectate:~$
你无法记录程序的debug输出结果。
只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按enter——如果程序持续输出信息而没有出现 $ 或 #)
使用nohup命令:
nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中断/挂起信号,使命令继续执行)
但是当你尝试使用命令:
1nohup command
时候却会遇到不大不小的麻烦……
delectate@delectate:~$ nohup vlcnohup: ignoring input and appending output to `nohup.out’
是的,虽然它自动把debug信息记录到nohup.out文件,但是你却无法使用这个终端进行任何操作。
所以你需要和第一个方法混用,即
nohupcommand {option}&
混用后,它会自动把你执行的命令输出结果记录到权限为-rw——-,名为nohup.out的文件中。
但是你仍然需要
delectate@delectate:~$ nohup vlc &[1] 9045delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out’ //在这里按一下回车或以ctrl+c以 //show a clean terminal delectate@delectate:~$
与使用 “&” 性质相同,当前启动程序的终端如果没有被关闭,已经启动的程序附在pst上;如果终端被关闭,则自动附在tty。
如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out。默认状态下,nohup默认输出到nohup.out文件,你也可以利用重定向来指定输出文件:
nohupcommand {option} > myout.file 2>&1 &
只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按enter——如果程序持续输出信息而没有出现 $ 或 #)
其他相关命令:
jobs:查看当前有多少在后台运行的命令
fg:将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
bg:将一个在后台暂停的命令,变成继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
杀死进程
杀死已经启动的程序和普通方式一样:
pkill -9 name
killall name
kill pid
…
命令应用:
linux服务器挂机下载;启动相关服务;linux服务器启动进程(尤其是ssh登录)
我就曾经用 1nohup aria2c -i downloadlist -m 0 -j 1 &
③ linux 找不到文件
linux下路径都是正斜杠“/”,你上面写的都是反斜杠“\”
换成 /opt/attach/file_folder/1109/1597492691.1111.doc 就行了
jiangtao9999 :java确实支持\\,不过只能在windows下使用,linux下只能用/,而windows下/也可以识别。所以以后写程序都用/,不要用\\。除非有一点:在找注册表里的键路径时必须用到\\
我去,怎么修改一次回答就跑最下面来了?
④ Linux进程后台运行的几种方式
Ctrl+z/bg/nohup/setsid/&
在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:
./rsync.sh jobs
但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1):对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:bg %1,放回前台运行:%1。
# nohup ./rsync.sh setsid ./rsync.sh &或
# (./rsync.sh &) ////在一个subshell中执行# ps -ef|grep rsync
nohup 的用途就是让提交的命令忽略 hangup 信号,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。。一般我们可在结尾加上”&”来将命令同时放入后台运行,也可用” > log.out 2>&1”来更改缺省的重定向文件名。
上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:
# jobs
# disown -h %1# ps -ef|grep rsync
效果与setid相同,但是disown后无法通过jobs命令查看了。
screen
还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便。
GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换,可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。
# yum install screen -y
常用screen参数:
# screen -S docker-d 新建一个名叫docker-d的session,并马上进入
# screen -dmS docker-d 新建一个名叫docker-d的session,但暂不进入,可用于系统启动脚本里
# screen -ls 列出当前所有session
# screen -r docker-d 恢复到zhouxiao这个session,前提是已经是断开状态(-d可以远程断开会话)
# screen -x docker-d 连接到离线模式的会话(多窗口同步演示)
# screen ./rsync.sh screen创建一个执行脚本的单窗口会话,可以attach进程ID
# screen -wipe 检查目前所有的screen作业,并删除已经无法使用的screen作业
正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
C-a w 显示所有窗口列表
C-a k 这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。
C-a d detach,暂时离开当前session
上面只是基本也是最常用的用法,更多请参考man screen或linux screen 命令详解。需要了解的是,一个用户创建的screen,其他用户(甚至root)通过screen -ls是看不见的。另外,Ctrl+a在bash下是用来回到行开头,不幸与上面的组合快捷键冲突。
⑤ linux上如何安装jstatd服务
此命令是一个RMI Server应用程序,提供了对JVM的创建和结束监视,也为远程监视工具提供了一个可以attach的接口
options
-nr 当一个存在的RMI Registry没有找到时,不尝试创建一个内部的RMI Registry
-p port 端口号,默认为1099
-n rminame 默认为JStatRemoteHost;如果多个jstatd服务开始在同一台主机上,rminame唯一确定一个jstatd服务
-J jvm选项
jstatd
会报如下错误:
Could not create remote object access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323) at java.security.AccessController.checkPermission(AccessController.java:546) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.System.setProperty(System.java:727) at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)
这是因为没有给jstatd指定安全策略
创建安全策略文件,并命名为jstatd.all.policy
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
再次启动
C:\Program Files\Java\jdk1.6.0_16\bin>jstatd -J-Djava.security.policy=jstatd.all.policy
利用jps查看正在运行的java命令
jps
C:\Documents and Settings\lulu>jps
4892 Bootstrap
1296 Jstatd
4484 Jps
3332 org.eclipse.equinox.launcher_1.0.201.R35x_v20090715.jar
此时就可以使用jvisualvm.exe以远程的方式监控JVM相关信息了。
更多例子
(1)使用内部RMI Registry
jstatd -J-Djava.security.policy=all.policy (默认端口为1099)
(2)使用外部RMI Registry
a)使用默认值
rmiregistry&
jstatd -J-Djava.security.policy=all.policy
b)使用2020端口
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020
c)使用2020端口,使用rminame
rmiregistry 2020&
jstatd -J-Djava.security.policy=all.policy -p 2020 -n AlternateJstatdServerName
(3)RMI Registry已经启动,不创建内部RMI Registry
jstatd -J-Djava.security.policy=all.policy -nr
(4)RMI日志能力
jstatd -J-Djava.security.policy=all.policy -J-Djava.rmi.server.logCalls=true
⑥ 如何使用linux的Documentation来写驱动
Linux I2C驱动是嵌入式Linux驱动开发人员经常需要编写的一种驱动,因为凡是系统中使用到的I2C设备,几乎都需要编写相应的I2C驱动去配置和控制它,例如 RTC实时时钟芯片、音视频采集芯片、音视频输出芯片、EEROM芯片、AD/DA转换芯片等等。
Linux I2C驱动涉及的知识点还是挺多的,主要分为Linux I2C的总线驱动(I2C BUS Driver)和设备驱动(I2C Clients Driver),本文主要关注如何快速地完成一个具体的I2C设备驱动(I2C Clients Driver)。关于Linux I2C驱动的整体架构、核心原理等可以在网上搜索其他相关文章学习。
本文主要参考了Linux内核源码目录下的 ./Documentation/i2c/writing-clients 文档。以手头的一款视频采集芯片TVP5158为驱动目标,编写Linux I2C设备驱动。
1. i2c_driver结构体对象
每一个I2C设备驱动,必须首先创造一个i2c_driver结构体对象,该结构体包含了I2C设备探测和注销的一些基本方法和信息,示例如下:
static struct i2c_driver tvp5158_i2c_driver = { .driver = { .name = "tvp5158_i2c_driver", }, .attach_adapter = &tvp5158_attach_adapter, .detach_client = &tvp5158_detach_client, .command = NULL, };
其中,name字段标识本驱动的名称(不要超过31个字符),attach_adapter和detach_client字段为函数指针,这两个函数在I2C设备注册的时候会自动调用,需要自己实现这两个函数,后面将详细讲述。
2. i2c_client 结构体对象
上面定义的i2c_driver对象,抽象为一个i2c的驱动模型,提供对i2C设备的探测和注销方法,而i2c_client结构体则是代表着一个具体的i2c设备,该结构体有一个data指针,可以指向任何私有的设备数据,在复杂点的驱动中可能会用到。示例如下:
struct tvp5158_obj{ struct i2c_client client; int users; // how many users using the driver }; struct tvp5158_obj* g_tvp5158_obj;
其中,users为示例,用户可以自己在tvp5158_obj这个结构体里面添加感兴趣的字段,但是i2c_client字段不可少。具体用法后面再详细讲。
3. 设备注册及探测功能
这一步很关键,按照标准的要求来写,则Linux系统会自动调用相关的代码去探测你的I2C设备,并且添加到系统的I2C设备列表中以供后面访问。
我们知道,每一个I2C设备芯片,都通过硬件连接设定好了该设备的I2C设备地址。因此,I2C设备的探测一般是靠设备地址来完成的。那么,首先要在驱动代码中声明你要探测的I2C设备地址列表,以及一个宏。示例如下:
static unsigned short normal_i2c[] = { 0xbc >> 1, 0xbe >> 1, I2C_CLIENT_END }; I2C_CLIENT_INSMOD;
normal_i2c 数组包含了你需要探测的I2C设备地址列表,并且必须以I2C_CLIENT_END作为结尾,注意,上述代码中的0xbc和0xbe是我在硬件上为我的tvp5158分配的地址,硬件上我支持通过跳线将该地址设置为 0xbc 或者 0xbe,所以把这两个地址均写入到探测列表中,让系统进行探测。如果你的I2C设备的地址是固定的,那么,这里可以只写你自己的I2C设备地址,注意必须向右移位1。
宏 I2C_CLIENT_INSMOD 的作用网上有许多文章进行了详细的讲解,这里我就不详细描述了,记得加上就行,我们重点关注实现。
下一步就应该编写第1步中的两个回调函数,一个用于注册设备,一个用于注销设备。探测函数示例如下:
static int tvp5158_attach_adapter(struct i2c_adapter *adapter) { return i2c_probe(adapter, &addr_data, &tvp5158_detect_client); }
这个回调函数系统会自动调用,我们只需要按照上述代码形式写好就行,这里调用了系统的I2C设备探测函数,i2c_probe(),第三个参数为具体的设备探测回调函数,系统会在探测设备的时候调用这个函数,需要自己实现。示例如下:
static int tvp5158_detect_client(struct i2c_adapter *adapter,int address,int kind) { struct tvp5158_obj *pObj; int err = 0; printk(KERN_INFO "I2C: tvp5158_detect_client at address %x ...\n", address); if( g_tvp5158_obj != NULL ) { //already allocated,inc user count, and return the allocated handle g_tvp5158_obj->users++; return 0; } /* alloc obj */ pObj = kmalloc(sizeof(struct tvp5158_obj), GFP_KERNEL); if (pObj==0){ return -ENOMEM; } memset(pObj, 0, sizeof(struct tvp5158_obj)); pObj->client.addr = address; pObj->client.adapter = adapter; pObj->client.driver = &tvp5158_i2c_driver; pObj->client.flags = I2C_CLIENT_ALLOW_USE; pObj->users++; /* attach i2c client to sys i2c clients list */ if((err = i2c_attach_client(&pObj->client))){ printk( KERN_ERR "I2C: ERROR: i2c_attach_client fail! address=%x\n",address); return err; } // store the pObj g_tvp5158_obj = pObj; printk( KERN_ERR "I2C: i2c_attach_client ok! address=%x\n",address); return 0; }
到此为止,探测并且注册设备的代码已经完成,以后对该 I2C 设备的访问均可以通过 g_tvp5158_obj 这个全局的指针进行了。
⑦ linux查看共享内存命令
共享内存查看
使用ipcs命令,不加如何参数时,会把共享内存、信号量、消息队列的信息都打印出来,如果只想显示共享内存信息,使用如下命令:
[root@localhost ~]# ipcs -m
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000000 1867776 root 600 393216 2 dest
0x00000000 1900545 root 600 393216 2 dest
0x00030021 1703938 zc 666 131104 1
0x0003802e 1736707 zc 666 131104 1
0x00030004 1769476 zc 666 131104 1
0x00038002 1802245 zc 666 131104 1
0x00000000 1933318 root 600 393216 2 dest
0x00000000 1966087 root 600 393216 2 dest
0x00000000 1998856 root 600 393216 2 dest
0x00000000 2031625 root 600 393216 2 dest
0x00000000 2064394 root 600 393216 2 dest
0x0014350c 2261003 cs 666 33554432 2
0x00000000 2129932 root 600 393216 2 dest
0x00000000 2162701 root 600 393216 2 dest
0x00143511 395837454 root 666 1048576 1
其中:
第一列就是共享内存的key;
第二列是共享内存的编号shmid;
第三列就是创建的用户owner;
第四列就是权限perms;
第五列为创建的大小bytes;
第六列为连接到共享内存的进程数nattach;
第七列是共享内存的状态status。其中显示“dest”表示共享内存段已经被删除,但是还有用户在使用它,当该段内存的mode字段设置为SHM_DEST时就会显示“dest”。当用户调用shmctl的IPC_RMID时,内存先查看多少个进程与这个内存关联着,如果关联数为0,就会销毁这段共享内存,否者设置这段内存的mod的mode位为SHM_DEST,如果所有进程都不用则删除这段共享内存。
⑧ linux中怎么使用gdb调试进程有dettach
在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。 follow-fork-mode的用法为: set follow-fork-mode [parentchild] parent: fork之后继续调试父进程,子进程不受影响。 child: fork之后调试子进程,父进程不受影响。 因此如果需要调试子进程,在启动gdb后: (gdb) set follow-fork-mode child并在子进程代码设置断点。 此外还有detach-on-fork参数,指示GDB在fork之后是否断开(detach)某个进程的调试,或者都交由GDB控制: set detach-on-fork [onoff] on: 断开调试follow-fork-mode指定的进程。 off: gdb将控制父进程和子进程。follow-fork-mode指定的进程将被调试,另一个进程置于暂停(suspended)状态。 注意,最好使用GDB 6.6或以上版本,如果你使用的是GDB6.4,就只有follow-fork-mode模式。 follow-fork-mode/detach-on-fork的使用还是比较简单的,但由于其系统内核/gdb版本限制,我们只能在符合要求的系统上才能使用。而且,由于follow-fork-mode的调试必然是从父进程开始的,对于fork多次,以至于出现孙进程或曾孙进程的系统,例如上图3进程系统,调试起来并不方便。 Attach子进程 众所周知,GDB有附着(attach)到正在运行的进程的功能,即attach <pid>命令。因此我们可以利用该命令attach到子进程然后进行调试。 例如我们要调试某个进程RIM_Oracle_Agent.9i,首先得到该进程的pid [root@tivf09 tianq]# ps -efgrep RIM_Oracle_Agent.9i nobody 6722 6721 0 05:57 ? 00:00:00 RIM_Oracle_Agent.9i root 7541 27816 0 06:10 pts/3 00:00:00 grep -i rim_oracle_agent.9i通过pstree可以看到,这是一个三进程系统,oserv是RIM_Oracle_prog的父进程,RIM_Oracle_prog又是RIM_Oracle_Agent.9i的父进程。 [root@tivf09 root]# pstree -H 6722通过 pstree 察看进程 启动GDB,attach到该进程 用 GDB 连接进程 现在就可以调试了。一个新的问题是,子进程一直在运行,attach上去后都不知道运行到哪里了。有没有办法解决呢? 一个办法是,在要调试的子进程初始代码中,比如main函数开始处,加入一段特殊代码,使子进程在某个条件成立时便循环睡眠等待,attach到进程后在该代码段后设上断点,再把成立的条件取消,使代码可以继续执行下去。 至于这段代码所采用的条件,看你的偏好了。比如我们可以检查一个指定的环境变量的值,或者检查一个特定的文件存不存在。以文件为例,其形式可以如下: void debug_wait(char *tag_file) { while(1) { if (tag_file存在) 睡眠一段时间; else break; } }当attach到进程后,在该段代码之后设上断点,再把该文件删除就OK了。当然你也可以采用其他的条件或形式,只要这个条件可以设置/检测即可。 Attach进程方法还是很方便的,它能够应付各种各样复杂的进程系统,比如孙子/曾孙进程,比如守护进程(daemon process),唯一需要的就是加入一小段代码。 GDB wrapper 很多时候,父进程 fork 出子进程,子进程会紧接着调用 exec族函数来执行新的代码。对于这种情况,我们也可以使用gdb wrapper 方法。它的优点是不用添加额外代码。 其基本原理是以gdb调用待执行代码作为一个新的整体来被exec函数执行,使得待执行代码始终处于gdb的控制中,这样我们自然能够调试该子进程代码。 还是上面那个例子,RIM_Oracle_prog fork出子进程后将紧接着执行RIM_Oracle_Agent.9i的二进制代码文件。我们将该文件重命名为RIM_Oracle_Agent.9i.binary,并新建一个名为RIM_Oracle_Agent.9i的shell脚本文件,其内容如下: [root@tivf09 bin]# mv RIM_Oracle_Agent.9i RIM_Oracle_Agent.9i.binary [root@tivf09 bin]# cat RIM_Oracle_Agent.9i #!/bin/sh gdb RIM_Oracle_Agent.binary当fork的子进程执行名为RIM_Oracle_Agent.9i的文件时,gdb会被首先启动,使得要调试的代码处于gdb控制之下。
⑨ linux下的一个进程在内存里包括哪三部分数据
代码段, 数据段, 堆, 栈
⑩ Linux安装基本命令
Linux安装基本命令大全
Linux常用命令,你还能记得多少呢?下文是我为大家准备的Linux常用命令,一起来看看吧!
安装升级
查看软件xxx安装内容
dpkg -L xxx
查找软件库中的软件
apt-cache search 正则表达式
或
aptitude search 软件包
显示系统安装包的统计信息
apt-cache stats
显示系统全部可用包的名称
apt-cache pkgnames
显示包的信息
apt-cache show k3b
查找文件属于哪个包
dpkg -S filename
apt-file search filename
查看已经安装了哪些包
dpkg -l
也可用
dpkg -l | less
翻页查看
查询软件xxx依赖哪些包
apt-cache depends xxx
查询软件xxx被哪些包依赖
apt-cache rdepends xxx
增加一个光盘源
sudo apt-cdrom add
系统更新
sudo apt-get update (这一步更新包列表)
sudo apt-get dist-upgrade (这一步安装所有可用更新)
或者
sudo apt-get upgrade (这一步安装应用程序更新,不安装新内核等)
清除所有已删除包的残馀配置文件
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P
如果报如下错误,证明你的系统中没有残留配置文件了,无须担心。
----------------------------------------------------------
dpkg: --purge needs at least one package name argument
Type dpkg --help for help about installing and deinstalling packages [*];
Use `dselect' or `aptitude' for user-friendly package management;
Type dpkg -Dhelp for a list of dpkg debug flag values;
Type dpkg --force-help for a list of forcing options;
Type dpkg-deb --help for help about manipulating *.deb files;
Type dpkg --license for right license and lack of warranty (GNU GPL) [*].
Options marked [*] proce a lot of output - pipe it through `less' or `more' !
----------------------------------------------------------
编译时缺少h文件的自动处理
sudo auto-apt run ./configure
查看安装软件时下载包的临时存放目录
ls /var/cache/apt/archives
备份当前系统安装的所有包的列表
dpkg --get-selections | grep -v deinstall > ~/somefile
从上面备份的安装包的列表文件恢复所有包
dpkg --set-selections < ~/somefile
sudo dselect
清理旧版本的软件缓存
sudo apt-get autoclean
清理所有软件缓存
sudo apt-get clean
删除系统不再使用的孤立软件
sudo apt-get autoremove
如果使用
sudo apt-get autoremove --purge
的话会把这些孤立软件的残留配置文件也一并移除
查看包在服务器上面的地址
apt-get -qq --print-uris download 软件包名称 | cut -d\' -f2
彻底删除Gnome
sudo apt-get --purge remove liborbit2
彻底删除KDE
sudo apt-get --purge remove libqt3-mt libqtcore4
一键安装 LAMP 服务
sudo tasksel install lamp-server
删除旧内核
sudo aptitude purge ~ilinux-image-.*\(\!\(`uname -r`\|generic-.*\)\)
导入ppa源的'key值
#W: GPG签名验证错误: http://ppa.launchpad.net jaunty Release: 由于没有公钥,下列签名无法进行验证: NO_PUBKEY 5126890CDCC7AFE0
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 5126890CDCC7AFE0 #5126890CDCC7AFE0替换为你需要导入的Key值
增加 add-apt-repository 命令
sudo apt-get install software-properties-common
增加一个ppa源
sudo add-apt-repository ppa:user/ppa-name
#使用 ppa 的地址替换 ppa:user/ppa-name
添加163镜像源
sudo add-apt-repository "deb http://mirrors.163.com/ubuntu/ `lsb_release -cs` main restricted universe multiverse"
sudo add-apt-repository "deb http://mirrors.163.com/ubuntu/ `lsb_release -cs`-updates main restricted universe multiverse"
sudo add-apt-repository "deb http://mirrors.163.com/ubuntu/ `lsb_release -cs`-security main restricted universe multiverse"
系统升级
1 这里指的是版本间的升级,例如 9.04=>10.04。
2 使用该升级方式通常需要使用 backports 源。
sudo apt-get update
sudo apt-get install update-manager-core
sudo do-release-upgrade
系统
查看内核
uname -a
查看系统是32位还是64位
#查看long的位数,返回32或64
getconf LONG_BIT
#查看文件信息,包含32-bit就是32位,包含64-bit就是64位
file /sbin/init
或者使用
uname -m
查看Ubuntu版本
lsb_release -a
或 cat /etc/lsb-release
查看内核加载的模块
lsmod
查看PCI设备
lspci
查看USB设备
lsusb
#加参数 -v 可以显示USB设备的描述表(descriptors)
lsusb -v
查看网卡状态
sudo apt-get install ethtool
sudo ethtool eth0
激活网卡的 Wake-on-LAN
sudo apt-get install wakeonlan
或 sudo ethtool -s eth0 wol g
查看CPU信息
cat /proc/cpuinfo
显示当前硬件信息
sudo lshw
查看内存型号
sudo dmidecode -t memory
获取CPU序列号或者主板序列号
#CPU ID
sudo dmidecode -t 4 | grep ID
#Serial Number
sudo dmidecode | grep Serial
#CPU
sudo dmidecode -t 4
#BIOS
sudo dmidecode -t 0
#主板:
sudo dmidecode -t 2
#OEM:
sudo dmidecode -t 11
显示当前内存大小
free -m |grep "Mem" | awk '{print $2}'
查看硬盘温度
sudo apt-get install hddtemp
sudo hddtemp /dev/sda
显示系统运行时间
uptime
查看系统限制
ulimit -a
查看内核限制
ipcs -l
查看当前屏幕分辨率
xrandr
硬盘
查看块设备
lsblk
查看硬盘的分区
sudo fdisk -l
硬盘分区
#危险!小心操作。
sudo fdisk /dev/sda
硬盘格式化
#危险!将第一个分区格式化为 ext3 分区, mkfs.reiserfs mkfs.xfs mkfs.vfat
sudo mkfs.ext3 /dev/sda1
硬盘检查
#危险!检查第一个分区,请不要检查已经挂载的分区,否则容易丢失和损坏数据
sudo fsck /dev/sda1
硬盘坏道检测
sudo badblocks -s -v -c 32 /dev/sdb
#得到坏的块后,使用分区工具隔离坏道。
分区挂载
sudo mount -t 文件系统类型 设备路经 访问路经
#常用文件类型如下: iso9660 光驱文件系统, vfat fat/fat32分区, ntfs ntfs分区, smbfs windows网络共享目录, reiserfs、ext3、xfs Linux分区
#如果中文名无法显示尝试在最后增加 -o nls=utf8 或 -o iocharset=utf8
#如果需要挂载后,普通用户也可以使用,在 -o 的参数后面增加 ,umask=022 如:-o nls=utf8,umask=022
分区卸载
sudo umount 目录名或设备名
只读挂载ntfs分区
sudo mount -t ntfs -o nls=utf8,umask=0 /dev/sdb1 /mnt/c
可写挂载ntfs分区
sudo mount -t ntfs-3g -o locale=zh_CN.utf8,umask=0 /dev/sdb1 /mnt/c
挂载fat32分区
sudo mount -t vfat -o iocharset=utf8,umask=0 /dev/sda1 /mnt/c
挂载共享文件
sudo mount -t smbfs -o username=xxx,password=xxx,iocharset=utf8 //192.168.1.1/share /mnt/share
挂载ISO文件
sudo mount -t iso9660 -o loop,utf8 xxx.iso /mnt/iso
查看IDE硬盘信息
sudo hdparm -i /dev/sda
查看软raid阵列信息
cat /proc/mdstat
参看硬raid阵列信息
dmesg |grep -i raid
cat /proc/scsi/scsi
查看SATA硬盘信息
sudo hdparm -I /dev/sda
或
sudo apt-get install blktool
sudo blktool /dev/sda id
查看硬盘剩余空间
df
df --help 显示帮助
查看目录占用空间
-hs 目录名
闪盘没法卸载
sync
fuser -km /media/闪盘卷标
使用文件来增加交换空间
#创建一个512M的交换文件 /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1M count=512
sudo mkswap /swapfile
sudo swapon /swapfile
#sudo vim /etc/fstab #加到fstab文件中让系统引导时自动启动
/swapfile swap swap defaults 0 0
查看硬盘当前读写情况
# 首先安装 sysstat 包
sudo apt-get install sysstat
#每2秒刷新一次
sudo iostat -x 2
测试硬盘的实际写入速度
dd if=/dev/zero of=test bs=64k count=512 oflag=dsync
进程
查看当前的内存使用情况
free
连续监视内存使用情况
watch -d free
# 使用 Ctrl + c 退出
动态显示进程执行情况
top
top指令运行时输入H或?打开帮助窗口,输入Q退出指令。
查看当前有哪些进程
ps -AFL
查看进程的启动时间
ps -A -opid,stime,etime,args
查看目前登入用户运行的程序
w
查看当前用户程序实际内存占用,并排序
ps -u $USER -o pid,rss,cmd --sort -rss
统计程序的内存耗用
ps -eo fname,rss|awk '{arr[$1]+=$2} END {for (i in arr) {print i,arr[i]}}'|sort -k2 -nr
按内存从大到小排列进程
ps -eo "%C : %p : %z : %a"|sort -k5 -nr
列出前十个最耗内存的进程
ps aux | sort -nk +4 | tail
按cpu利用率从大到小排列进程
ps -eo "%C : %p : %z : %a"|sort -nr
ps aux --sort -pcpu |head -n 20
查看当前进程树
pstree
中止一个进程
kill 进程号(就是ps -A中的第一列的数字)
或者 killall 进程名
强制中止一个进程(在上面进程中止不成功的时候使用)
kill -9 进程号
或者 killall -9 进程名
图形方式中止一个程序
xkill 出现骷髅标志的鼠标,点击需要中止的程序即可
查看进程打开的文件
lsof -p 进程的pid
显示开启文件abc.txt的进程
lsof abc.txt
显示22端口现在运行什么程序
lsof -i :22
显示nsd进程现在打开的文件
lsof -c nsd
在后台运行程序,退出登录后,并不结束程序
nohup 程序 &
#查看中间运行情况tail nohup
在后台运行交互式程序,退出登录后,并不结束程序
sudo apt-get install screen
screen vim a.txt
#直接退出后使用
screen -ls # 2208pxs-0.ubuntu (Detached)
screen -r 1656 #恢复
#热键,同时按下Ctrl和a键结束后,再按下功能键
C-a ? #显示所有键绑定信息
C-a w #显示所有窗口列表
C-a C-a #切换到之前显示的窗口
C-a c #创建一个新的运行shell的窗口并切换到该窗口
C-a n #切换到下一个窗口
C-a p #切换到前一个窗口(与C-a n相对)
C-a 0..9 #切换到窗口0..9
C-a a #发送 C-a到当前窗口
C-a d #暂时断开screen会话
C-a k #杀掉当前窗口
在后台运行交互式程序,退出登录后,并不结束程序
tmux 进入后再运行其它命令
tmux attach #恢复
#热键,同时按下Ctrl和b键结束后,再按下功能键
C-b c #创建一个新的运行shell的窗口并切换到该窗口
C-b n #切换到下一个窗口
C-b p #切换到前一个窗口(与C-a n相对)
C-b 0..9 #切换到窗口0..9
C-b d #暂时断开会话
C-b & #杀掉当前窗口
详细显示程序的运行信息
strace -f -F -o outfile
增加系统最大打开文件个数
#ulimit -SHn
sudo vim /etc/security/limits.conf
文件尾追加
* hard nofile 4096
* soft nofile 4096
sudo vim /etc/pam.d/su
将 pam_limits.so 这一行注释去掉
重起系统
清除僵尸进程
ps -eal | awk '{ if ($2 == "Z") {print $4}}' | xargs sudo kill -9
将大于120M内存的php-cgi都杀掉
ps -eo pid,fname,rss|grep php-cgi|grep -v grep|awk '{if($3>=120000) print $1}' | xargs sudo kill -9
Linux系统中如何限制用户进程CPU占用率
renice +10 `ps aux | awk '{ if ($3 > 0.8 && id -u $1 > 500) print $2}'`
#或直接编辑/etc/security/limits.conf文件。 ;