linux学习问题总结
本文主要是自己学习linux中的一些思考和总结的记录
一、环境变量和普通变量的区别
区别就是普通变量只会影响当前进程,子进程可以继承父进程的环境变量
二、rsyslog和logrotate会不会丢记录的问题
先说结论:不会
logrotate有create和copytruncate方案,这里是考虑create这种默认方案。说说logrotate的操作步骤:假设日志文件为daemon.log,当前已经到了轮换的时间,logrotate会先重命名daemon.log为daemon.log.1,然后新建一个daemon.log,给对应的进程发送HUP信号通知他日志已经更新
当时一直在思考这个问题,一个进程在写入一个日志,然后logrotate将该日志文件重命名,创建个新的同名文件的过程中,日志数据会不会丢失,这个问题其实还是对linux文件系统的理解不够深刻。
- linux的文件分为inode和datanode,而文件系统是以inode来唯一标志这个文件的,进程在打开文件的时候对应这个inode的一个文件标志符。
- 你要明白linux的文件名存在哪里,linux文件名其实是存在目录中,目录也是文件,该文件存放了文件名和inode的对应关系,这里也就理解了linux的硬链接,同一个文件可以有多个名字
理解了上面的也就理解了为什么不会,logrotate在重命名的时候只是修改了目录项,并没有影响实际的文件,所以该进程还是在往重命名后的文件写入,logrotate给进程发信号通知进程,进程在响应信号的函数中去根据文件名查找新的inode,替换文件描述符,往新文件写入
这里要特别注意你的程序要能响应这个HUP信号,不处理这个信号默认行为就是停止进程。
三、为什么有些文件夹大小不是4096的整数倍
我们知道文件系统中文件存放需要inode(索引区块)和dnode(数据区块),一个文件只有需要一个inode,dnode则是是一个或多个。目录也是文件,但是在查看目录的时候发现有时候目录竟然不占用区块,很多目录的大小都是4096的整数倍这个很好理解,因为文件系统每个dnode大小都是固定的,一般都是4k,所以占用一个或者多个就是4096的整数倍。那为什么有些目录大小不占用区块呢?
这其实是xfs的一个优化,如果目录项比较少,那么他就将数据存放到了目录的inode当中,所以不占用区块。
我在自己的电脑上里用ll -s命令查看跟目录,可以看到dev、bin和home不占用数据区块(看第一列)。
0 lrwxrwxrwx. 1 root root 7 3月 23 08:30 bin -> usr/bin
4 dr-xr-xr-x. 5 root root 4096 4月 3 22:01 boot
0 drwxr-xr-x. 19 root root 3300 4月 3 23:17 dev
12 drwxr-xr-x. 144 root root 8192 4月 6 11:18 etc
0 drwxr-xr-x. 5 root root 45 4月 3 23:06 home
既然谈到了文件大小的问题就补充下ls命令和du命令
du查看文件和目录的大小
du -sh *
ls命令显示文件大小问题
ls -s -S
-s 输出大小
-S 按大小排序
-r 逆序排序
四、reboot和shutdown等软链接实现原理
我们先来查看下reboot和shutdown的文件:
[chen@chen ~]$ ll `which reboot` `which shutdown`
lrwxrwxrwx. 1 root root 16 3月 30 22:12 /usr/sbin/reboot -> ../bin/systemctl
lrwxrwxrwx. 1 root root 16 3月 30 22:12 /usr/sbin/shutdown -> ../bin/systemctl
可以看到这两文件都是链接到systemctl符号链接,这里我觉得很奇怪,都是链接到systemctl为什么行为能不一样?难道这两个符号链接有什么不一样吗?
但是怎么去查看符号链接的内容,通过cat /usr/sbin/reboot这种命令去查看时是直接到了源文件,这时候可以使用readlink这个命令去读取符号链接的内容,内容如下:
[chen@chen ~]$ readlink `which reboot` `which shutdown`
../bin/systemctl
../bin/systemctl
可以看到内容是一样的,那么到底是怎么实现的。其实这里是通过获取启动时的名称来做判断的。看下下面的程序你就明白了:
#include<stdio.h>
int main(int argc,char * argv[]){
for(int i=0;i<argc;i++)
printf("%s\n",argv[i]);
}
上面的程序打印了程序的输入参数,利用gcc -std=c99 name.c编译后产生a.out文件,建立一个a.out的符号链接ln -s a.out b。
[chen@chen ~]$ `pwd`/a.out
/home/chen/a.out
[chen@chen ~]$ ./a.out
./a.out
[chen@chen ~]$ ./b
./b
可以看到输出的程序名称的不同,你在建立符号链接的时候用到了不同的名字,systemctl可以根据名字来走不同的逻辑。所以如果你在自己的目录建立一个reboot链接:ln -s /bin/systemctl reboot实现的效果是一样的。
五、systemd启动时执行脚本的问题
早先SystemV的init中我们有启动时需要执行的脚本时都会加入rc.local中,在systemd已经不推荐使用这个方法,我想很大的一个原因就是因为并行执行的问题。如果这个脚本有大量耗时的任务,那么这个脚本只能按顺序一个一个的执行才能启动。所以systemd其中很大的一个改进就是并行执行,它建议我们自己编写一个service的配置文件,利用systemd来管理。
我的理解是如果是快速简单的命令还是可以放在原来的init目录,毕竟比较方便
六、crontab计划任务随机执行
有计划任务想到的一个问题,如果我有很多任务在某个时刻需要执行,为了避免同一个时间执行导致负载过高所以需要一些随机化的处理而不是同一时刻触发
思想就是加入随机函数,例如要在1小时内随机化:利用RANDOM环境变量$[(RANDOM%60]
别忘了在cron配置文件中%需要转义:$[(RANDOM\%60]
最终结果如下 : 0 1 * * * sleep $[(RANDOM\%60]m ; /home/data/shell/script.sh
七、日志输出和标准输出
这里谈谈自己java开发的业务中的日志,我们java的日志现在一般采用的是log4fj和logback这种,在日志的配置中我们一般会有多个appender,例如输出到文件的和输出到标准输出的。我们在ide中运行的程序的时候,标准输出的所有输出都会输出在console中,如果去线上部署,例如nohup daemon & &>/dev/null这种方式,标准输出被重定向到/dev/null中,因为日志也配置了文件的appender所以没什么问题,但是如果你对代码中有System.out.println这种输出,那么这些信息就都丢了。所以尽量使用log来统一输出日志,还可以配置下将程序的标准输出也写入到日志中。
参考链接
- why-directories-size-are-different-in-ls-l-output-on-xfs-file-system
- Cron jobs and random times, within given hours
linux学习问题总结的更多相关文章
- Linux学习日记-使用EF6 Code First(四)
一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是 请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...
- Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码
在上一篇随笔里面详细讲解了Linux系统的启动过程 (Linux学习之CentOS(二十一)--Linux系统启动详解),我们知道Linux系统的启动级别一共有6种级别,通过 /etc/inittab ...
- Linux学习笔记之兄弟连
systemctl --user enable pulseaudio说明:安装完成后系统没有声音,用该命令可以打开.ifconfig eth0 192.168.118.1说明:给网卡设置IP地址.ap ...
- Linux学习内容
Linux学习要点(转载自红联) 一.学习Linux的基本要求1. 掌握至少50个以上的常用命令. 2. 熟悉Gnome/KDE等X-windows桌面环境操作 . 3. 掌握.tgz..rpm等软件 ...
- Linux 学习笔记
Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...
- Linux学习心得之 Linux下命令行Android开发环境的搭建
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...
- Linux学习心得之 Linux下ant安装与使用
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下ant安装与使用 1. 前言2. ant安装3. 简单的a ...
- 实验楼 linux 学习
实验楼 linux 学习 一.Linux 用户管理 1.查看用户 who am i // who mom likes whoami ====--------====== 输入的第一列表示打 ...
- linux学习网站分享
http://www.zhihu.com/question/19895288 http://linux.vbird.org/ 两个linux学习的网页存起来,以后学习.
- linux学习笔记2-linux的常用命令
第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...
随机推荐
- Android图片的Base64编码与解码
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法. Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较 ...
- ThreadLocal 类 的源码解析以及使用原理
1.原理图说明 首先看这一张图,我们可以看出,每一个Thread类中都存在一个属性 ThreadLocalMap 成员,该成员是一个map数据结构,map中是一个Entry的数组,存在entry实体, ...
- 使用JAVA反射技术实现代码零耦合与功能无限扩展!
1.反射使用的背景 最近在做一个功能,就是实现邮件发送功能,但是邮件发送有不同的内容和数据格式,在开始设计的时候直接将发送的内容写在了发送模块中,后来发现功能增加后,无法继续在里边写了,因为里边的功能 ...
- Android为TV端助力 http下载视频到指定目录
public void httpget(String uri){ HttpURLConnection connection = null; FileOutputStream fos = null; F ...
- Android sdk下载找不到support library
没有android support library下载项. 找了很多资料,发现 android support library 被Google废弃了,不推荐使用.代替使用的是 android supp ...
- mongodb安装失败与解决方法(附安装教程)
安装mongodb遇到的一些坑 浪费了大量的时间 在此记录一下 主要是电脑系统win10企业版自带的防火墙 当然还有其他的一些坑 一般的问题在第6步骤都可以解决,本教程的安装步骤不够详细的话 ...
- Struts2之action 之 感叹号 ! 动态方法调用
struts2的动态方法调用的方式: 1.第一种方式:设置method属性 在Action类中定义一个签名与execute方法相同.只是名字不同的方法,如定义为: public String logi ...
- webpack项目轻松混用css module
前言 本文讲述css-loader开启css模块功能之后,如何与引用的npm包中样式文件不产生冲突. 比如antd-mobilenpm包的引入.在不做特殊处理的前提下,样式文件将会被转译成css mo ...
- 转:修改IIS虚拟目录名称bat脚本
@echo off echo ------------------------------------------------------------------------------ echo - ...
- liunx搭建DHCP服务器以及DHCP中继服务器
liunx搭建DHCP服务器以及DHCP中继服务器 一.实验拓扑 二.实验条件 虚拟机取消VMnet1和VMnet8的dhcp动态获取ip地址,以免影响实验 DHCPserver 网关以及DHCP中继 ...