本文主要是自己学习linux中的一些思考和总结的记录

一、环境变量和普通变量的区别

区别就是普通变量只会影响当前进程,子进程可以继承父进程的环境变量

二、rsyslog和logrotate会不会丢记录的问题

先说结论:不会

logrotate有create和copytruncate方案,这里是考虑create这种默认方案。说说logrotate的操作步骤:假设日志文件为daemon.log,当前已经到了轮换的时间,logrotate会先重命名daemon.log为daemon.log.1,然后新建一个daemon.log,给对应的进程发送HUP信号通知他日志已经更新

当时一直在思考这个问题,一个进程在写入一个日志,然后logrotate将该日志文件重命名,创建个新的同名文件的过程中,日志数据会不会丢失,这个问题其实还是对linux文件系统的理解不够深刻。

  1. linux的文件分为inode和datanode,而文件系统是以inode来唯一标志这个文件的,进程在打开文件的时候对应这个inode的一个文件标志符。
  2. 你要明白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来统一输出日志,还可以配置下将程序的标准输出也写入到日志中。

参考链接

  1. why-directories-size-are-different-in-ls-l-output-on-xfs-file-system
  2. Cron jobs and random times, within given hours

linux学习问题总结的更多相关文章

  1. Linux学习日记-使用EF6 Code First(四)

    一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是  请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...

  2. Linux学习之CentOS(二十二)--单用户模式下修改Root用户的密码

    在上一篇随笔里面详细讲解了Linux系统的启动过程 (Linux学习之CentOS(二十一)--Linux系统启动详解),我们知道Linux系统的启动级别一共有6种级别,通过 /etc/inittab ...

  3. Linux学习笔记之兄弟连

    systemctl --user enable pulseaudio说明:安装完成后系统没有声音,用该命令可以打开.ifconfig eth0 192.168.118.1说明:给网卡设置IP地址.ap ...

  4. Linux学习内容

    Linux学习要点(转载自红联) 一.学习Linux的基本要求1. 掌握至少50个以上的常用命令. 2. 熟悉Gnome/KDE等X-windows桌面环境操作 . 3. 掌握.tgz..rpm等软件 ...

  5. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  6. Linux学习心得之 Linux下命令行Android开发环境的搭建

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下命令行Android开发环境的搭建 1. 前言2. Jav ...

  7. Linux学习心得之 Linux下ant安装与使用

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Linux学习心得之 Linux下ant安装与使用 1. 前言2. ant安装3. 简单的a ...

  8. 实验楼 linux 学习

    实验楼 linux 学习     一.Linux 用户管理 1.查看用户 who am i // who mom likes whoami   ====--------====== 输入的第一列表示打 ...

  9. linux学习网站分享

    http://www.zhihu.com/question/19895288 http://linux.vbird.org/ 两个linux学习的网页存起来,以后学习.

  10. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

随机推荐

  1. JMeter java.net.SocketException:Operationnotsupported:connect解决方案

    java.net.SocketException: Operation not supported: connect解决方案   by:授客 QQ:1033553122 测试环境 apache-jme ...

  2. C# 加密术

    本文是利用一个简单的小例子,简述C#中和加密术有关的内容,仅供学习参考用. 概述 随着信息技术的发展,计算机网络为信息的获取.传输.处理.利用与共享提供了一个高效.快捷.安全的通信环境和传输通道,网络 ...

  3. vue 构建项目vue-cli

    1.首先得有node和npm的环境,node的下载:http://nodejs.org/download/.安装node之后,npm也自动生成了,显示版本号就意味着安装成功 2.接下来就是安装vue- ...

  4. Javascript数组系列三之迭代方法2

    今天我们来继续 Javascript 数组系列的文章,上文 <Javascript数组系列二之迭代方法1> 我们说到一些数组的迭代方法,我们在开发项目实战的过程中熟练的使用可以大大提高我们 ...

  5. AlexNet卷积神经网络【前向反馈】

    1.代码实现 # -*- coding: utf-8 -*- """ Created on Wed Nov 14 17:13:05 2018 @author: zhen ...

  6. This network connection does not exist

    This network connection does not exist 在windows server 2008上面map了一个磁盘,共享的folder被我停止共享后,点击该磁盘的disconn ...

  7. js获取当前页面url网址信息

    js如何准确获取当前页面url网址信息 在WEB开发中,时常会用到javascript来获取当前页面的url网址信息,在这里是我的一些获取url信息的小总结. 下面我们举例一个URL,然后获得它的各个 ...

  8. puppet 和 apache passenger的配置

    目录 1. 概要 2. apache passenger 安装测试 2.1. 什么是 apache passenger 2.2. 安装 apache passenger 2.3. 配置 apache ...

  9. May 30. 2018 Week 22nd Wednesday

    Never forget to say "Thanks." 永远不要忘记说谢谢. Don't take anything we get for granted, and never ...

  10. 13.scrapy框架的日志等级和请求传参

    今日概要 日志等级 请求传参 如何提高scrapy的爬取效率 今日详情 一.Scrapy的日志等级 - 在使用scrapy crawl spiderFileName运行程序时,在终端里打印输出的就是s ...