一、虚拟文件系统
Windows用的是物理文件系统
Linux用的是虚拟文件系统VFS,虚拟目录树
VFS可以看做是虚拟目录树,每个文件都有自己的inode号,可以当做id。
目录树结构
df命令:查看文件系统挂载情况
umount /boot 解除boot的挂载
mount /dev/sda1/boot /boot 把/dev/sda1/boot 目录挂载到 /boot
ll 查看目录详情
ls 查看目录
pwd 查看当前路径(目录树结构)
mkdir 创建目录
cp /root/a.txt /root/b/c.txt 把a.txt 拷贝 b目录下并命名为c.txt
多个文件同时拷贝到 ./lib64/目录下
echo 打印
echo $$ 打印当前进程号
二、文件描述符
重定向 > 如echo “hello” > hello.txt 写入内容到hello.txt
所以以前 nohup java -jar jar包名 >log.file 2>&1 &
任何程序都有0 1 2 文件描述符
0 标准输入 1 标准输出 2 错误输出/proc目录是内核映射的变量属性,里面的每个数字就是进程id号,进程、网络、变量属性等都在这里被映射成文件,一切皆文件。而 $ $ 是获取当前和我互动的bash的pid,通过$ BASHPID也能获取到这个当前进程ID,所以使用 /proc/$$/fd lsof -op $ $ 能获取当前文件描述符的细节
cd /proc/$ $ 进入当前进程的空间
ls 查看当前进程的内容
cd fd 进入io空间,查看所有本进程开启的IO
三、IO重定向
nohup java -jar jar包名 >log.file 2>&1 &
具体参数参照 http://t.csdn.cn/AUQbS
nobup内容输出
java -jar xxx.jar 某jar包
输出内容重定向到这个文件 >log.file文件
重定向描述符如果后面放的是文件描述符 即 2> 1 则中间必须加&,即2>& 1,这是硬性约束,如果不写会被认为是把 错误 写到 名叫1的这个文件里去
2> 1把前面的这个文件的错误写到名叫1的文件中
2>&1 把前面的这个文件的错误作为输入写到后面的文件中去
如果是>>则是追加模式
顺序不能错,1是文件描述符 输出 2是文件描述符错误 0是文件描述符输入
命令 > log.file 2>&1 是 先把 jar的内容指向 log.file(1),再把输出指向1
& 后台不挂断运行
四、硬链接与软连接
文件系统,如上图左边第一个字母什么意思
-普通文件
d目录
l 连接,连接分为 软连接和硬连接vim demo.txt
ln demo.txt demo2.txt 此时会创建一个硬连接 demo2.txt
stat demo.txt和stat demo2.txt,得到的Inode是一样的,即id是一样的硬连接:磁盘里这个文件真实存在,有自己的path,相当于创建了一个新的指针,也指向同一块内存
软连接:如windows里的快捷方式
硬连接被引用的数量,此时如果 rm -f demo.txt,也没啥影响,demo2.txt依旧指向源数据空间,数据不会丢失,只是这个被引用的数量会减一。同理,如果修改了demo.txt打开的文件,demo2.txt打开后发现也变了。相当于两个都是个文件指针而言。ln -s demo.txt demo2.txt 创建软连接,就是快捷方式
stat 后两个的Inode号也不同
此时修改一个,另一个也会内容发生变化,这是连接的特性
不过删除就不一样了,删除demo2.txr无影响 ,本来就只是个快捷方式
但删除demo.txt
b 块设备,如硬盘
c 字符设备,如键盘输入那种
s socket 一切皆文件,socket文件
p 管道 pipeline [eventpoll]
五、PackCache
packcache 页缓存 4K
早期计算机是单进程,一次把整个进程读进内存,后来发展到多进程并行运行,就是多个进程运行在内存的不同位置,但是会引发两个问题:内存不足 和 内存读取数据边界控制,防止读到其他进程的数据。
由内存不足,引发了分块,就是一个页表,把一个进程分成4K的块,需要哪一块,就把对应的块读到内存。
由数据边界访问,发展到虚拟内存,通过地址映射,保证不会读取到其他进程的数据。
一个文件如果被打开两个,不会同时创建两个空间,第二个发现对应的packcache已经命中了,直接返回数据
六、管道 (前面的输出作为后面的输入)
查看前十行信息
查看前三行
查看后十行
查看后两行信息
但是没有直接查看第几行的命令,此时就可以使用管道,把前面的输出作为后面的输入
查看第二行
所以 ps -ef 是打印所有进程信息
ps -ef | grep 8080
输出所有进程信息到管道进行处理,grep抓取关于 8080 的所有信息
注意优先级
此处" $" 的优先级高于管道,所以先打印"$"的进程号,再执行管道,类似 ++a
其实最后的进程号已经不是原进程号了,只是优先级没$$高,没打印出来
10388才是管道的pid
七、进程隔离
创建变量y=100,打印,创建子进程,打印y为空,进程间数据隔离
export可以使当前变量父子进程都能访问到
代码块的使用,都是运行在同一进程下的
注意两边留空格
同时开启两个子进程
注意此时不要再输出了,要阻塞住进程,再开个面板看信息。
查看进程信息 lsof -op 进程号