2024-08-16

IO多路复用是指通过一种机制,程序可以同时监视多个文件描述符,一旦某个文件描述符就绪(一般是读或写就绪),就能进行相应的读写操作。在Linux中,IO多路复用通常使用select, poll, 和 epoll系统调用实现。

  1. selectselect系统调用允许进程指定一个或多个等待的文件描述符集合,然后阻塞直到其中一个或多个文件描述符变为就绪。select的缺点是每次调用都需要重新设置文件描述符集合,并且文件描述符数量有限制。
  2. pollpoll系统调用类似于select,但没有描述符的限制。
  3. epollepoll是Linux下的一种高性能IO多路复用机制,相对于selectpollepoll使用了更加高效的事件通知机制,能够同时支持水平触发和边缘触发,并且没有文件描述符限制。

三者的特点和优缺点如下:

  • select

    优点:基本上在所有现代Unix/Linux系统中都有实现。

    缺点:文件描述符集合需要在每次调用前重新设置,并且最大文件描述符数有限制。

  • poll

    优点:没有文件描述符数量的限制。

    缺点:性能不如epoll

  • epoll

    优点:高效的事件通知机制,支持水平触发和边缘触发,没有文件描述符数量限制。

    缺点:只在Linux 2.6及更高版本的内核中可用。

代码示例:




// 使用select
fd_set rfds;
struct timeval tv;
int retval;
 
// 初始化文件描述符集合
FD_ZERO(&rfds);
FD_SET(0, &rfds); // 监视标准输入
 
// 设置超时时间
tv.tv_sec = 1;
tv.tv_usec = 0;
 
// 调用select
retval = select(1, &rfds, NULL, NULL, &tv);
 
if (retval > 0) {
    // 标准输入可读
    if (FD_ISSET(0, &rfds)) {
        // 读取数据
    }
}
 
// 使用epoll
#include <sys/epoll.h>
 
int epfd;
struct epoll_event event;
epfd = epoll_create(10); // 创建epoll实例
 
event.data.fd = STDIN_FILENO; // 添加要监视的文件描述符
event.events = EPOLLIN; // 设置监视的事件类型
epoll_ctl(epfd, EPOLL_CTL_ADD, STDIN_FILENO, &event);
 
// 等待事件
struct epoll_event events[10]; // 事件缓冲区
int nfds = epoll_wait(epfd, events, 10, 1000); // 等待1000毫秒
 
for (int n = 0; n < nfds; ++n) {
    if (events[n].data.fd == STDIN_FILENO) {
        // 标准输入可读
        // 读取数据
    }
}

在实际应用中,epoll是性能最优的选择,尤其是在处理大量并发连接时。而selectpoll主要在向后兼容或者在不支持epoll的旧

2024-08-16

管道(pipe)是Linux系统中进程间通信的一种方式,可以将一个进程的输出作为另一个进程的输入。

创建管道的系统调用是pipe(),其函数原型如下:




#include <unistd.h>
 
int pipe(int pipefd[2]);

参数pipefd是一个大小为2的数组,其中:

  • pipefd[0]用于读取管道。
  • pipefd[1]用于写入管道。

返回值:成功时返回0,失败时返回-1。

下面是一个使用管道的简单示例:




#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int main() {
    int pipefd[2];
    pid_t pid;
    char buf;
    int ret;
 
    // 创建管道
    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }
 
    // 创建子进程
    if ((pid = fork()) == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }
 
    if (pid == 0) { // 子进程
        close(pipefd[1]); // 关闭写端
        sleep(2); // 等待父进程写入数据
 
        while (read(pipefd[0], &buf, 1) > 0) {
            printf("子进程接收到数据: %c\n", buf);
        }
 
        close(pipefd[0]);
        _exit(EXIT_SUCCESS);
    } else { // 父进程
        close(pipefd[0]); // 关闭读端
        write(pipefd[1], "A", 1); // 写入数据
        sleep(2);
        write(pipefd[1], "B", 1); // 写入数据
        close(pipefd[1]);
 
        waitpid(pid, NULL, 0); // 等待子进程结束
        exit(EXIT_SUCCESS);
    }
}

在这个示例中,父进程创建管道并创建子进程,然后关闭管道的读端,并通过写端向管道写入数据"A"和"B"。子进程关闭管道的写端,并通过读端读取管道的数据。父子进程通过管道通信,父进程写入子进程读取,实现了数据的交换。

2024-08-16

在Linux下使用命令行打开图片文件,可以使用多种图片查看器,如feh, eog, display等。以下是一些示例:

  1. 使用feh(Fast Image Viewer)查看器:



feh your_image.jpg
  1. 使用eog(Eye of GNOME Image Viewer)查看器:



eog your_image.jpg
  1. 使用display命令(X11 display image tool):



display your_image.jpg

确保你已经安装了所选择的图片查看器。如果没有安装,可以通过包管理器进行安装,例如使用aptyum。例如,要在Ubuntu或Debian系统上安装feh,可以使用:




sudo apt-get install feh

在Red Hat、CentOS等系统上,可以使用yum安装:




sudo yum install feh

请根据你的Linux发行版选择合适的包管理器和安装命令。

2024-08-16

在Linux系统中,SSH服务默认使用22端口。如果你想要修改SSH的默认端口,你需要编辑SSH的配置文件。

步骤如下:

  1. 打开SSH配置文件。这个文件通常位于/etc/ssh/sshd_config



sudo nano /etc/ssh/sshd_config
  1. 找到配置文件中的Port 22这行。
  2. 修改为你想要的端口号,例如Port 2222
  3. 保存并关闭配置文件。
  4. 重启SSH服务以应用更改。



sudo systemctl restart sshd
  1. 确保新端口在防火墙中开放。如果你使用的是iptables,可以使用以下命令:



sudo iptables -A INPUT -p tcp --dport 2222 -j ACCEPT

如果你使用的是firewalld,可以使用以下命令:




sudo firewall-cmd --permanent --add-port=2222/tcp
sudo firewall-cmd --reload
  1. 确保没有其他服务使用了你选择的端口。

完成以上步骤后,你的SSH服务将只监听新指定的端口。记得从安全性考虑,只通过信任的设备或网络访问新端口,避免潜在的安全风险。

2024-08-16

在Linux上搭建SFTP服务器,可以使用openssh-server包来实现。以下是简要步骤和示例代码:

  1. 安装openssh-server



sudo apt-update
sudo apt-get install openssh-server
  1. 确认SSH服务正在运行:



sudo systemctl status ssh
  1. 创建SFTP用户并设置密码(如果需要):



sudo adduser sftpuser
sudo passwd sftpuser
  1. 配置SSH以使用chroot环境限制SFTP用户到其家目录:

    编辑/etc/ssh/sshd_config文件,添加或修改以下行:




# 确保以下配置已经存在并且被设置为yes
UsePAM yes
 
# 添加下面的行来禁止SFTP用户访问shell
Match User sftpuser
    ChrootDirectory /home/sftpuser
    ForceCommand internal-sftp
    AllowTcpForwarding no
    X11Forwarding no
  1. 重启SSH服务以应用更改:



sudo systemctl restart ssh

现在你应该有一个运行中的SFTP服务器,可以通过SFTP客户端使用sftpuser用户和其密码连接到服务器。

2024-08-16

Rocky Linux 8 的安装过程比较简单,以下是基于最小安装的基本步骤:

  1. 下载Rocky Linux 8 ISO镜像文件。
  2. 制作启动USB驱动器(如果从USB启动)。
  3. 重新启动计算机,并进入BIOS/UEFI设置从USB启动。
  4. 从USB启动并选择“Install Rocky Linux 8”选项开始安装过程。
  5. 遵循安装程序的步骤,包括选择语言、配置键盘、磁盘分区、网络配置以及设置root用户密码等。
  6. 开始安装过程,等待直到完成。
  7. 重启后,移除USB驱动器(如果从USB安装)并继续使用本地硬盘启动。
  8. 完成安装后,创建或者配置额外的用户和组。

这里不提供具体的命令行步骤,因为安装过程主要是通过图形界面完成的。如果需要通过命令行安装,可以考虑使用Kickstart或者AutoKickstart等工具自动化安装过程。

2024-08-16

报错解释:

这个错误表明ifconfig命令在当前的Linux环境中不存在。ifconfig是一个用于配置和显示Linux内核中网络接口参数的传统工具,但在最新的Linux发行版中已经被ip命令所取代。如果系统中没有ifconfig,就会出现“command not found”的错误。

解决方法:

  1. 如果你使用的是较新版本的Linux发行版,可以使用ip命令来代替ifconfig。例如,查看所有网络接口及配置,可以使用以下命令:

    
    
    
    ip addr show
  2. 如果你出于某种原因需要使用ifconfig,可以尝试安装net-tools包,该包包含了ifconfig和其他一些网络工具。在基于Debian的系统(如Ubuntu)中,可以使用以下命令安装:

    
    
    
    sudo apt-get update
    sudo apt-get install net-tools

    在基于RPM的系统(如Fedora)中,可以使用以下命令安装:

    
    
    
    sudo dnf install net-tools
  3. 如果你正在使用一个极端的定制发行版或者容器(如Docker),ifconfig可能被默认移除以减少体积,这种情况下你需要自行编译安装net-tools或者使用ip命令。
  4. 如果你使用的是一个较老的Linux系统,那么ifconfig可能已经预装。如果确实没有找到,可能需要检查你的PATH环境变量是否包含了ifconfig所在的目录。
2024-08-16

有多种方法可以在Linux中定时删除历史日志,以下是几种可能的实现方法:

  1. 使用crontab定时任务:使用crontab命令编辑crontab文件,添加一个定时任务,指定删除历史日志的命令。例如,可以使用以下命令编辑crontab文件:



crontab -e

然后在文件中添加以下内容来每周删除历史日志:




0 0 * * 0 rm /path/to/logs/*.log

这会在每个星期日的午夜时删除指定路径下的所有日志文件。

  1. 使用logrotate:logrotate是一个用于管理日志文件的实用工具。它可以按时间、大小等条件对日志文件进行旋转,包括删除旧的日志文件。你可以创建一个logrotate配置文件,指定需要删除的日志文件的路径和条件,然后将其添加到logrotate的定时任务中。例如,创建一个名为my\_logs的配置文件:



/path/to/logs/*.log {
    weekly
    rotate 4
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        /bin/rm -f /path/to/logs/*.log.5
    endscript
}

这将每周旋转日志文件,并保留4个旧的日志文件。在旋转之后,postrotate部分的命令将删除5个旧的日志文件。

  1. 使用logstash:使用logstash可以实时处理和转发日志数据。你可以设置logstash将日志数据发送到目标位置之前在本地删除旧的日志文件。你可以在logstash配置文件中设置一个定时任务,使用filebeat来监视日志文件夹并发送数据,然后在发送之前删除旧的日志文件。
  2. 使用Shell脚本和cron定时任务:你可以编写一个Shell脚本,其中包含删除历史日志的命令,然后使用crontab添加一个定时任务,定期运行该脚本。例如,创建一个名为delete\_logs.sh的脚本:



#!/bin/bash
find /path/to/logs/ -type f -mtime +7 -delete

这将删除指定路径下7天前的所有日志文件。然后,使用以下命令添加一个每天凌晨运行该脚本的定时任务:




0 0 * * * /path/to/delete_logs.sh

这将在每天午夜时运行脚本并删除旧的日志文件。

2024-08-16

Grep 是一个强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。在 Linux 中,你可以使用 grep 命令来搜索文件。

以下是一些使用 Grep 命令在 Linux 中搜索文件的方法:

  1. 在文件中搜索特定的字符串:



grep "string_to_search" file_name

例如,如果你想在名为 "example.txt" 的文件中搜索字符串 "hello",你可以运行以下命令:




grep "hello" example.txt
  1. 在多个文件中搜索特定的字符串:



grep "string_to_search" file1 file2 file3

例如,如果你想在 "example1.txt", "example2.txt" 和 "example3.txt" 文件中搜索字符串 "hello",你可以运行以下命令:




grep "hello" example1.txt example2.txt example3.txt
  1. 使用正则表达式搜索文件:



grep -e "regex" file_name

例如,如果你想在 "example.txt" 文件中搜索任何以 "hel" 开头的字符串,你可以运行以下命令:




grep -e "^hel" example.txt
  1. 在文件中搜索字符串并显示行号:



grep -n "string_to_search" file_name

例如,如果你想在 "example.txt" 文件中搜索字符串 "hello" 并显示行号,你可以运行以下命令:




grep -n "hello" example.txt
  1. 在文件中搜索字符串并忽略大小写:



grep -i "string_to_search" file_name

例如,如果你想在 "example.txt" 文件中不区分大小写地搜索字符串 "hello",你可以运行以下命令:




grep -i "hello" example.txt
  1. 在文件中搜索字符串,并显示匹配字符串前后的行:



grep -C 2 "string_to_search" file_name

例如,如果你想在 "example.txt" 文件中搜索字符串 "hello",并显示匹配字符串前后的两行,你可以运行以下命令:




grep -C 2 "hello" example.txt
  1. 在文件中搜索字符串,并只显示匹配的文件名:



grep -l "string_to_search" file_name

例如,如果你想在 "example.txt" 文件中搜索字符串 "hello",并只显示匹配的文件名,你可以运行以下命令:




grep -l "hello" example.txt
  1. 在文件中搜索字符串,并只显示不匹配的行:



grep -v "string_to_search" file_name

例如,如果你想在 "example.txt" 文件中搜索字符串 "hello",并只显示不匹配的行,你可以运行以下命令:




grep -v "hello" example.txt
  1. 在文件中搜索字符串,并使用特定的正则表达式搜索:



grep -P "^string_to_search\$" file_name

例如,如果你想在 "example.txt" 文件中搜索以 "hello" 结尾的字符串,你可以运行以下命

2024-08-16

在Linux系统中,使用iptables来验证访问HDFS所使用的端口,你可以通过添加规则来允许或拒绝特定端口的流量。以下是一个示例,用于允许访问HDFS默认端口(通常是9000)的流量。

首先,你需要确认HDFS的端口配置。在HDFS的配置文件hdfs-site.xml中查找dfs.namenode.http-addressdfs.namenode.https-address属性,以确定使用的HTTP和HTTPS端口。

然后,你可以使用以下命令来允许访问这些端口:




# 允许HTTP端口(例如9870)的入站连接
sudo iptables -A INPUT -p tcp --dport 9870 -m state --state NEW,ESTABLISHED -j ACCEPT
 
# 允许HTTPS端口(例如9871)的入站连接
sudo iptables -A INPUT -p tcp --dport 9871 -m state --state NEW,ESTABLISHED -j ACCEPT
 
# 允许返回流量(例如9870)
sudo iptables -A OUTPUT -p tcp --sport 9870 -m state --state ESTABLISHED -j ACCEPT
 
# 允许返回流量(例如9871)
sudo iptables -A OUTPUT -p tcp --sport 9871 -m state --state ESTABLISHED -j ACCEPT

请将上述命令中的端口号(9870和9871)替换为实际配置的端口号。

注意,这些规则在系统重启后不会自动保留。要永久保存这些规则,你需要将它们添加到iptables的配置文件中,这通常是/etc/iptables/rules.v4(对于IPv4)或/etc/iptables/rules.v6(对于IPv6),然后重新加载iptables规则。

确保在进行这些操作之前,你有适当的权限,并且已经备份了当前的iptables规则,以防需要恢复默认设置。