Linux下的两个特殊的文件(可用来清理日志)——/dev/null与/dev/zero

2023-11-09

1. /dev/null简介

在类Unix系统中,/dev/null被称为空设备,是一个特殊的设备文件。写入/dev/null,会丢弃一切写入其中的数据(但报告写入操作成功);读取/dev/null,则会立即得到一个EOF。

在Unix行话中,/dev/null被称为位桶(bit bucket)或者黑洞(black hole)。空设备通常被用于丢弃不需要的输出流,或作为用作输入流的空文件。当你读取它时,空设备会提供无限的空字符(NULL、ASCII NUL、0x00)。

2. /dev/null用法

test.py的内容

asdasdassAdf
  • 查看文件内容
# cat test.py

asdasdassAdf
  • 禁止标准输出
# cat test.py > /dev/null 

或者

# cat test.py 1> /dev/null 

1是默认重定向,就是标准输出。

  • 禁止标准错误输出
# cat test.py 2> /dev/null

在使用cat $filename时,如果filename对应的文件不存在,系统肯定会报错: “ cat: filename: 没有那个文件或目录 ” 。假如有错误输出,会通过> /dev/null输出到黑洞,就不会看到错误输出。

  • 测试命令的退出码(测试命令是否正常运行)
# cat test.py 2> /dev/null > /dev/null

# echo $?

0   //命令执行没有错误

或者

# cat test.py &> /dev/null 

# echo $?

0  //命令执行没有错误

以上,如果test.py不存在,将不会有任何错误信息提示;如果test.py存在, 文件的内容不会打印到标准输出。因此, 上面的代码根本不会输出任何信息,只是为了测试命令的退出码而不想有任何的输出。

  • 删除文件的内容而不删除文件本身(可用来手动清空日志文件)
// 把messages.json内容清空,而不删除文件

# cat /dev/null > /var/log/messages.json   

: > /var/log/messages 有同样的效果,但不会产生新的进程,因为:是内建的。

  • 删除文件,通过使用/dev/null软链接,永远不再生成文件(永不生成日志)
#!/bin/bash

#
# clean_log.sh
#

if [ -f /var/log/messages.json ];then
    rm -f /var/log/messages.json # 如果存在就删除,之后才可以添加软链接
fi

ln -s /dev/null /var/log/messages.json 


3. /dev/zero简介

与/dev/null一样,/dev/zero也是一个伪文件,但它实际上产生连续不断的null流(二进制的零流,而不是ASCII型的),写入它的输出会丢失不见。/dev/zero的主要用处是用来创建一个指定长度的用于初始化的空文件,像临时交换文件。

比如说,我们使用dd制作U盘启动系统,U盘有16G。制作好启动盘以后,系统只占了2.5G,而其他的空间(将近12G)都无法使用。我们可以使用如下指令给整个U盘清零。

# dd if=/dev/zero of=/dev/sdb bs=4M


4. /dev/zero使用

  • 使用/dev/zero,创建一个交换临时文件
#!/bin/bash
# 创建一个交换文件,参数为创建的块数量(不带参数则为默认),一块为1024B(1K)

ROOT_UID=0         # Root 用户的 $UID 是 0.
E_WRONG_USER=65    # 不是 root?

FILE=/swap
BLOCKSIZE=1024
MINBLOCKS=40
SUCCESS=0

# 这个脚本必须用root来运行,如果不是root作出提示并退出
if [ "$UID" -ne "$ROOT_UID" ]
then
  echo; echo "You must be root to run this script."; echo
  exit $E_WRONG_USER
fi 

blocks=${1:-$MINBLOCKS}          # 如果命令行没有指定,则设置为默认的40块.
# 上面这句等同如:
# --------------------------------------------------
# if [ -n "$1" ]
# then
#   blocks=$1
# else
#   blocks=$MINBLOCKS
# fi
# --------------------------------------------------

if [ "$blocks" -lt $MINBLOCKS ]
then
  blocks=$MINBLOCKS              # 最少要有 40 个块长,如果带入参数比40小,将块数仍设置成40
fi 

echo "Creating swap file of size $blocks blocks (KB)."
dd if=/dev/zero of=$FILE bs=$BLOCKSIZE count=$blocks # 把零写入文件.

mkswap $FILE $blocks             # 将此文件建为交换文件(或称交换分区).
swapon $FILE                     # 激活交换文件.

echo "Swap file created and activated."
exit $SUCCESS

运行效果

$ vim testswap.sh  // 添加以上内容

$ chmod +x testswap.sh 

$ sudo ./testswap.sh           
[sudo] password for long:    

Creating swap file of size 40 blocks (KB).
记录了40+0 的读入
记录了40+0 的写出
40960字节(41 kB)已复制,0.000904021 秒,45.3 MB/秒
正在设置交换空间版本 1,大小 = 36 KiB
无标签, UUID=3e59eddf-098f-454d-9507-aba55f434a8c
Swap file created and activated.
  • 为特定的目的,而用零去填充一个指定大小的文件
#!/bin/bash
# ramdisk.sh

# "ramdisk"是系统RAM内存的一段,它可以被当成是一个文件系统来操作.
# 优点:存取速度非常快 (包括读和写).
# 缺点: 易失性, 当计算机重启或关机时会丢失数据.
#       会减少系统可用的RAM.
#
# 那么ramdisk有什么作用呢?
# 保存一个较大的数据集在ramdisk, 比如一张表或字典,这样可以加速数据查询, 因为在内存里查找比在磁盘里查找快得多.

E_NON_ROOT_USER=70             # 必须用root来运行.
ROOTUSER_NAME=root

MOUNTPT=/mnt/ramdisk
SIZE=2000                      # 2K 个块 (可以合适的做修改)
BLOCKSIZE=1024                 # 每块有1K (1024 byte) 的大小
DEVICE=/dev/ram0               # 第一个 ram 设备

username=`id -nu`
if [ "$username" != "$ROOTUSER_NAME" ]
then
  echo "Must be root to run ""`basename $0`""."
  exit $E_NON_ROOT_USER
fi

if [ ! -d "$MOUNTPT" ]         # 测试挂载点是否已经存在了,
then                           #+ 如果这个脚本已经运行了好几次了就不会再建这个目录了
  mkdir $MOUNTPT               #+ 因为前面已经建立了.
fi

dd if=/dev/zero of=$DEVICE count=$SIZE bs=$BLOCKSIZE # 把RAM设备的内容用零填充.
                                                      # 为何需要这么做?
mke2fs $DEVICE                 # 在RAM设备上创建一个ext2文件系统.
mount $DEVICE $MOUNTPT         # 挂载设备.
chmod 777 $MOUNTPT             # 使普通用户也可以存取这个ramdisk,但是, 只能由root来缷载它.

echo """$MOUNTPT"" now available for use."
# 现在 ramdisk 即使普通用户也可以用来存取文件了.
# 注意, ramdisk是易失的, 所以当计算机系统重启或关机时ramdisk里的内容会消失.
#
# 重启之后, 运行这个脚本再次建立起一个 ramdisk.
# 仅重新加载 /mnt/ramdisk 而没有其他的步骤将不会正确工作.

# 如果加以改进, 这个脚本可以放在 /etc/rc.d/rc.local,以使系统启动时能自动设立一个ramdisk。这样很合适速度要求高的数据库服务器.
exit 0

运行效果

$ vim ramdisk.sh       // 添加以上内容

$ chmod +x ramdisk.sh

$ sudo ./ramdisk.sh

记录了2000+0 的读入
记录了2000+0 的写出
2048000字节(2.0 MB)已复制,0.0113732 秒,180 MB/秒
mke2fs 1.42.8 (20-Jun-2013)
Discarding device blocks: 完成
文件系统标签=
OS type: Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
16384 inodes, 65536 blocks
3276 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=67108864
8 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
    8193, 24577, 40961, 57345

Allocating group tables: 完成
正在写入inode表: 完成
Writing superblocks and filesystem accounting information: 完成

/mnt/ramdisk now available for use.

最后值得一提的是,ELF二进制文件利用了/dev/zero。

5. 参考文章

https://www.cnblogs.com/lishihai/p/7986565.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux下的两个特殊的文件(可用来清理日志)——/dev/null与/dev/zero 的相关文章

  • 使用TensorFlow实现LSTM

    使用TensorFlow实现LSTM 使用Cell实现 以Cell方式实现LSTM import os import numpy as np import tensorflow as tf from tensorflow import ke
  • Ubuntu 配置第三方动态库的系统环境变量

    环境 ubuntu16 04 Qt5 7 1 简述 将第三方动态库配置到系统环境变量中 便于使用 步骤 1 将第三方动态库的头文件及 so 文件拷贝到桌面 RSAInclude文件夹 lib文件夹 2 进入桌面文件夹 打开命令框 3 输入命
  • PHP上传Excel-xls-xlsx

    PHP上传Excel xls格式和xlsx格式 PHPExcle插件 引入插件 require once assets PHPExcel 1 8 Classes PHPExcel php 视图层代码
  • 安装TomCat的艰辛历程

    学习Java的初级阶段 是个充满无奈与呵呵的时间 就安装一个TomCat我就安装了一晚上 还没有成功 所以我给我的 捉猫泪史 写个传 以免后来者重蹈覆辙 首先 安装TomCat之前 先将Java环境搭好 就是下载并安装Java develo
  • Porter-Duff compositing rules

    1984 年 7 月 计算机图形 杂志 18 期 253 259 页 刊登了Porter Thomas 和 Duff Tom 的论文 Compositing Digital Ima ges 文中讲述了12个合成规则 这些规则都是基于一些简单
  • Windows编程基础--第12节 MFC之树控件CTreeCtrl

    树形控件 Tree Control 用来显示一系列项目的层次关系 最典型的例子是显示磁盘上的文件与文件夹 如果有子项目的话 单击树形控件中的项目可以展开或者收缩其子项目 MFC提供了CTreeCtrl类进行支持 树控件在windows程序中
  • 如何评价2023美赛春季赛YZ题加赛 大学生数学建模

    作为之前数模国奖美赛F的选手 这次得空会更新下今年美赛相关的免费思路 并给出直播答疑 欢迎蹲坑 欢迎一起交流 将在本帖更新2023美国大学生数学建模数模美赛各个赛题思路 大家可以点赞收藏 一 参赛报名 组队参赛 每队人数3人 专业不限 二
  • tf.name_scope和tf.variable_scope的用法

    文章目录 tf get variable 和 tf variable tf get variable 和 tf variable scope tf variable scope 和 tf name scope tf get variable
  • java 异常 错误_有关JAVA异常和错误(ERROR)的处理

    异常的处理主要包括捕获异常 程序流程的跳转和异常处理语句块的定义等 当一个异常被抛出时 应该有专门的语句来捕获这个被抛出的异常对象 这个过程被称为捕获异常 当一个异常类的对象被捕获后 用户程序就会发生流程的跳转 系统中止当前的流程而跳转至专
  • 【毕设选题】最新51单片机毕业设计项目集合 - 500例

    文章目录 1前言 2 STM32 毕设课题 3 如何选题 3 1 不要给自己挖坑 3 2 难度把控 3 3 如何命名题目 4 最后 1前言 更新单片机嵌入式选题后 不少学弟学妹催学长更新STM32和C51选题系列 感谢大家的认可 来啦 以下
  • Java对文件的基本操作(查找、读取)

    1 读取目录下的所有文件 隐藏的文件一网打尽 快速定位要找的那个文件 查询路径下的所有文件 param path 路径 private static void find String path File file new File path
  • 使用DatagramSocket发送、接收数据(1)

    Java使用DatagramSocket代表UDP协议的Socket DatagramSocket本身只是码头 不维护状态 不能产生IO流 它的唯一作用就是接收和发送数据报 Java使用DatagramPacket来代表数据报 Datagr
  • 给 Typora 改个背景颜色

    因为白色 在多云天气的时候 看上去有的扎眼 所以就想修改一下颜色 但本地的主题 不好看 所以就想简简单单换一个颜色 网上有很多 自定义主题的文章 我懒 只想改背景颜色 不想弄那么多的操作 换成这种颜色 就是好看 哈哈哈 操作 在 typor
  • 清华大学LightGrad-TTS,且流式实现

    论文链接 https arxiv org abs 2308 16569 代码地址 https github com thuhcsi LightGrad 数据支持 针对BZNSYP和LJSpeech提供训练脚本 针对Grad TTS提出两个问
  • stm32外部中断

    目录 1 STM32的外部中断线 2 NVIC嵌套向量中断器 3 外部中断 事件控制器 EXTI 4 STM32CubeMX配置外部中断 1 外部中断是什么 想象一个场景 你在家里玩游戏 这时候突然来电话了 这时你会停止玩游戏去接电话 电话
  • 开源|携程机票 App KMM 跨端 KV 存储库 MMKV-Kotlin

    作者简介 禹昂 携程移动端资深工程师 专注于 Kotlin 移动端跨平台领域 Kotlin 中文社区核心成员 图书 Kotlin 编程实践 译者 一 背景 携程机票移动端研发团队自 2021 年始就一直在移动端实践 Kotlin Multi
  • 关于二进制的练习

    前言 一 二题为牛客网练习 都有题目链接 文章目录 一 两个整数二进制位不同个数 二 输入一个整数 n 输出该数32位二进制表示中1的个数 其中负数用补码表示 三 获取一个整数二进制序列中所有的偶数位和奇数位 分别打印出二进制序列 一 两个
  • 马尔可夫过程

    马尔可夫过程的定义 平稳过程的平稳性保证了未来可以通过过去来预知 而马尔科夫是这样的一类过程 即未来只与现在有关 与过去无关 就是你的过去是什么样子不重要 未来只与自己当下的努力有关 我们只需要知道当前的信息就够了 举一个实际例子比如说卖电

随机推荐

  • 静态路由协议的默认管理距离是_距离矢量路由选择协议

    上一节我们主要讲述了影响路由选择协议的四个因素 路径决策 度量 收敛 负载均衡 也提了一下大多数路由选择协议的分类有距离矢量和链路状态 本节我们主要讲述一下距离矢量路由选择协议 首先说一下 该路由选择协议的由来 由于该路由选择协议通告的方式
  • https网络编程——如何做web的访问控制机制(ACL)

    参考 如何做web的访问控制机制 ACL 地址 https qingmu blog csdn net article details 108286660 spm 1001 2014 3001 5502 目录 ACL含义 例子 具体实现 AC
  • Linux相关的小知识点

    Linux 中每个 TCP 连接最少占用多少内存 详细解释 Linux 内核到底长啥样详细解释
  • GPS模块启动模式

    文章目录 GPS启动模式 1 冷启动 2 热启动 3 温启动 GPS模块举例 GPS启动模式 有3种启动模式 冷启动 温启动 热启动 启动时间 冷启动 gt 温启动 gt 热启动 启动时间越长定位越慢 用户使用体验越差 1 冷启动 冷启动是
  • Segmentation简记1-The Liver Tumor Segmentation Benchmark (LiTS)

    创新点 最主要的创新是建立了一个肝脏CT图像分割数据库 总结 类似于综述加上数据库的介绍 没有细看 医学方面时候会用到
  • 并发编程系列文章-Java线程的创建方式

    文章目录 继承Thread类 实现Runnable接口 使用Callable和Future创建有返回值的线程 使用Executor框架创建线程池 几个关键类的关系图 实战例子 常见的Java线程的4中方式包括 继承Thread类 实现Run
  • 用docker命令时报错,提示:Cannot connect to the Docker daemon at unix:///var/run/docker.sock.

    报错现象 root node02 docker ps Cannot connect to the Docker daemon at unix var run docker sock Is the docker daemon running
  • 工作中报错故障集合

    OOM常见报错排查之堆外内存溢出 报错 ExecutorLostFailure executor xxx exited caused by one of the running tasks Reason Container killed b
  • numpy和torch的一些操作

    1 如何把数据从1维扩充成2维 np expand dims x1 axis 1 或者x1 x1 None 从 2 33075 换成两个 1 33075 x1 x1 None 2 numpy trace array 返回数组沿对角线元素的和
  • Unet网络搭建(Pytorch)

    Unet是一个经典的语义分割网络 常常被用于医学影像的分割 在Unet的网络结构中 可以分为卷积模块 下采样模块以及上采样模块 详见下面的网络结构图 在网络的搭建过程中 也是依照分为三大块这种思路进行搭建 话不多说 直接上代码 import
  • Ubuntu 12.04 64位编译android 4.1.1_r3

    一 初始化编译环境 google推荐的编译环境是在Ubuntu LTS 10 04 但是新的LTS版本12 04已经出来 没必要在旧版本上做文章了 很多行特性和驱动10 04上都没有 例如无线网卡驱动 所以果断选择12 04的LTS版本 对
  • NSGA2算法原理及python实现

    git参考代码 Program Name NSGA II py Description This is a python implementation of Prof Kalyanmoy Deb s popular NSGA II algo
  • Python软件编程等级考试三级——20200913B

    Python软件编程等级考试三级 20200913B 理论 单选题 判断题 实操 第一题 第二题 第三题 理论 单选题 1 关于利用CSV模块对文件进行操作 下列描述不正确的是 A CSV是一种常用的文本格式 使用逗号分隔值的 B CSV模
  • DBus 介绍

    一 什么是 DBus D Bus是一个为应用程序间通信的消息总线系统 用于进程之间的通信 1 1 三层架构 1 函数库libdbus gt gt gt gt gt 用于两个应用程序互相联系和交互消息 2 基于 libdbus 构造的消息总线
  • 《Java进阶学习+面试宝典》高级架构师指南-剑指阿里P8

    企业对Java的需求最大 Java程序员的群体也最为庞大 有着 1200万之多 彼此之间都有更多的选择 换句话说 也是最修罗场的 要想在明年的金三银四拿下自己心仪的offer 咱就一定要做好功课 把那些必考点 套路都给吃透了 为此我专门整理
  • Spring Data CrudRepository增删改查方法(八)

    CrudRepository 的主要方法 long count boolean exists Integer arg0
  • 数据结构有哪些

    概念 数据结构 数据用什么样的方式组合在一起 数据结构是计算机存储数据的方式 指相互之间存在一种或多种特定关系的数据元素集合 常见数据结构 数据存储的常用结构有 栈 队列 数组 链表和红黑树 栈 stack 又称堆栈 它是运算受限的线性表
  • springboot基于Java的衣服穿搭推荐系统-计算机毕业设计

    收藏关注不迷路 文章目录 一 项目介绍 二 开发环境 三 功能介绍 四 核心代码 五 效果图 六 文章目录 一 项目介绍 随着人们物质生活水平的提高 对于精神需求也日趋增长 在日常生活中会更加注意外在形象 尤其是在穿衣搭配方面 无论是日常生
  • C++智能指针详解

    1 概述 我们知道除了静态内存和栈内存外 每个程序还有一个内存池 这部分内存被称为自由空间或者堆 程序用堆来存储动态分配的对象即那些在程序运行时分配的对象 当动态对象不再使用时 我们的代码必须显式的销毁它们 在C 中 动态内存的管理是用一对
  • Linux下的两个特殊的文件(可用来清理日志)——/dev/null与/dev/zero

    1 dev null简介 在类Unix系统中 dev null被称为空设备 是一个特殊的设备文件 写入 dev null 会丢弃一切写入其中的数据 但报告写入操作成功 读取 dev null 则会立即得到一个EOF 在Unix行话中 dev