2024-08-19

在Linux中,进程是正在执行的程序的实例。每个进程都有自己的地址空间、内存、数据段、堆栈等。

要查看系统中的进程,可以使用ps命令。ps是"process status"的缩写。以下是几个常用的ps命令选项:

  • ps -e:显示所有进程。
  • ps -f:显示完整格式。
  • ps -aux:显示所有用户的进程。

例如,要以全格式显示所有进程,可以使用以下命令:




ps -ef

另外,top命令可以实时显示进程信息,包括CPU和内存使用情况。




top

如果你想要查看特定进程的信息,可以使用grep工具过滤输出。例如,查看包含"bash"的进程:




ps -ef | grep bash

创建一个新进程,可以使用fork()系统调用,它会创建一个与父进程几乎完全相同的子进程。以下是一个简单的示例:




#include <stdio.h>
#include <unistd.h>
 
int main() {
    pid_t pid = fork();
 
    if (pid == -1) {
        // 错误处理
        perror("fork failed");
        return 1;
    } else if (pid == 0) {
        // 子进程
        printf("Hello from child process!\n");
    } else {
        // 父进程
        printf("Hello from parent process!\n");
    }
 
    return 0;
}

编译并运行这段代码,会创建一个子进程,打印出相应的消息。父进程和子进程的区别在于fork()返回值。子进程接收0,而父进程接收子进程的ID。

2024-08-19

在Linux系统中,~/.ssh目录是用来存放SSH客户端配置文件和密钥的。SSH密钥对可用于验证和加密登录SSH服务器或使用SSH协议的其他服务。

  1. known_hosts文件:保存远程主机的公钥。当你第一次通过SSH连接到远程主机时,系统会询问你是否信任该主机,并将其公钥添加到known_hosts文件中,以防止中间人攻击。
  2. id_rsaid_rsa.pub:这是SSH密钥对的私钥和公钥。默认情况下,SSH客户端会查找这两个文件来进行身份验证。
  3. authorized_keys文件:保存所有允许登录服务器的客户端的公钥。服务器会检查客户端提供的公钥是否在这个文件中。
  4. config文件:用于自定义SSH客户端的行为,比如指定特定的私钥文件或者使用特定的端口。

使用SSH密钥对进行身份验证的基本步骤如下:

  1. 在客户端生成密钥对(通常使用ssh-keygen命令)。
  2. 将客户端的公钥id_rsa.pub添加到服务器的~/.ssh/authorized_keys文件中。
  3. 客户端尝试SSH登录服务器时,服务器会用authorized_keys中的公钥来验证客户端的私钥。

示例代码:

生成密钥对:




ssh-keygen

将公钥复制到服务器:




ssh-copy-id user@server

登录服务器:




ssh user@server
2024-08-19

报错解释:

这个错误表明Python程序在尝试导入某个模块时,发现它依赖的共享库libstdc++.so.6的版本不满足要求。ImportError通常发生在Linux系统中,当系统中安装的库版本与程序编译时链接的库版本不兼容时。

解决方法:

  1. 如果你有root权限,可以通过包管理器升级libstdc++6包到所需的版本。例如,在Ubuntu系统中,你可以使用以下命令:

    
    
    
    sudo apt-get update
    sudo apt-get install --only-upgrade libstdc++6
  2. 如果没有root权限,你可以尝试使用如下方法:

    • 使用动态链接器LD_PRELOAD环境变量来指定正确版本的库:

      
      
      
      export LD_PRELOAD=/path/to/correct/libstdc++.so.6
    • 如果你有该库的正确版本,可以将其复制到一个你有权限的目录下,如~/lib,然后设置LD_LIBRARY_PATH环境变量:

      
      
      
      export LD_LIBRARY_PATH=~/lib
    • 使用LD_LIBRARY_PATH环境变量直接指定库的路径:

      
      
      
      export LD_LIBRARY_PATH=/path/to/lib:$LD_LIBRARY_PATH
  3. 如果上述方法都不可行,你可能需要联系系统管理员来获取root权限,或者在没有该库版本的系统上安装一个兼容的Python版本。

在尝试解决方法时,请确保你理解每一步操作的后果,并在执行前备份重要数据。如果你不是在自己的机器上工作,而是在服务器或其他人的机器上,请遵守相关政策和程序,避免破坏系统稳定性。

2024-08-19

以下是部署Vue项目到Linux服务器的步骤概述和示例代码:

  1. 安装Node.js和npm:



sudo apt update
sudo apt install nodejs
sudo apt install npm
  1. 确认安装成功:



nodejs --version
npm --version
  1. 安装Vue CLI:



npm install -g @vue/cli
  1. 创建新的Vue项目(如果你已有项目则跳过此步):



vue create my-vue-app
  1. 进入项目目录:



cd my-vue-app
  1. 构建项目:



npm run build
  1. 安装nginx:



sudo apt install nginx
  1. 配置nginx服务器块,编辑/etc/nginx/sites-available/default



server {
    listen 80;
    server_name your_domain_or_IP;
 
    location / {
        root /path/to/your/vue/project/dist;
        try_files $uri $uri/ /index.html;
    }
}
  1. 重新加载nginx配置:



sudo nginx -s reload
  1. 如果你的服务器使用的是非80端口,确保你的安全组规则允许访问该端口。
  2. 现在你可以通过服务器的IP地址或域名访问你的Vue应用了。

注意:以上步骤提供了一个概览和示例,根据你的具体需求和环境,可能需要额外的步骤。

2024-08-19

搭建私有YUM仓库的步骤如下:

  1. 安装并启动createrepo:



sudo yum install -y createrepo
  1. 创建存放RPM包的目录,并将需要上传的RPM包放入该目录:



mkdir -p /var/www/html/repo
cp /path/to/rpm-packages/* /var/www/html/repo/
  1. 运行createrepo来创建仓库元数据:



createrepo /var/www/html/repo/
  1. 配置web服务器,使得可以通过HTTP访问仓库。可以使用Apache或Nginx,以下以Apache为例:



sudo yum install -y httpd
sudo systemctl start httpd
sudo systemctl enable httpd
  1. 将RPM包目录挂载为web服务器的一个目录并重启Apache服务:



sudo vi /etc/httpd/conf/httpd.conf
# 添加如下配置,确保DocumentRoot指向/var/www/html
<Directory "/var/www/html">
    ...
</Directory>
 
sudo systemctl restart httpd
  1. 创建yum仓库配置文件:



mkdir -p /etc/yum.repos.d/repo.d
vi /etc/yum.repos.d/repo.d/private.repo

添加以下内容:




[private]
name=Private Repository
baseurl=http://your-server-ip/repo
enabled=1
gpgcheck=0
  1. 清除yum缓存并生成新的仓库缓存:



yum clean all
yum makecache

现在你的私有YUM仓库已经搭建完成,可以通过yum命令来安装仓库中的包了。

2024-08-19

Linux常见服务默认端口号如下:

  1. SSH (安全登录和远程shell) - 默认端口22
  2. HTTP (超文本传输协议) - 默认端口80
  3. HTTPS (安全超文本传输协议) - 默认端口443
  4. FTP (文件传输协议) - 默认端口21
  5. SMTP (简单邮件传输协议) - 默认端口25
  6. POP3 (邮局协议版本3) - 默认端口110
  7. IMAP4 (互联网消息访问协议版本4) - 默认端口143
  8. MySQL (数据库管理系统) - 默认端口3306
  9. PostgreSQL (数据库管理系统) - 默认端口5432
  10. Samba (文件共享) - 默认端口139, 445 (其中445是主要的)
  11. DNS (域名系统) - 默认端口53
  12. SQL Server (数据库管理系统) - 默认端口1433
  13. Oracle (数据库管理系统) - 默认端口1521
  14. MongoDB (数据库管理系统) - 默认端口27017
  15. Redis (内存数据库) - 默认端口6379
  16. Elasticsearch (搜索引擎) - 默认端口9200

注意:这些默认端口可能会被防火墙规则或服务配置文件修改。

2024-08-19

在Linux系统中,VIM(Vi IMproved)是一款强大的文本编辑器。以下是一些基本的配置和美化VIM的方法:

  1. 配置VIM

创建或编辑.vimrc文件,在用户的主目录下:




vim ~/.vimrc

添加一些基本配置:




set number          " 显示行号
set autoindent      " 自动缩进
set shiftwidth=4    " 设置Tab键的宽度为4个空格
syntax on           " 开启语法高亮
set cursorline      " 突出显示当前行
set background=dark " 背景设为暗色
  1. 安装插件管理器

VIM有一个强大的插件生态,推荐使用VundleVim-PlugPathogen作为插件管理器。

Vundle为例,首先安装Vundle:




git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

然后在.vimrc中配置插件:




set nocompatible              " 关闭兼容模式
filetype off                  " 文件类型检测关闭
set rtp+=~/.vim/bundle/Vundle.vim " 添加Vundle的路径到Vim的运行时路径
call vundle#begin()           " 开始Vundle的配置
Plugin 'VundleVim/Vundle.vim' " 插件声明
" 更多插件配置
call vundle#end()             " 结束Vundle的配置
filetype plugin indent on     " 文件类型检测打开、插件启用和缩进机制启用
  1. 安装插件

.vimrc中使用Vundle插件管理器声明你想要安装的插件,然后在VIM中运行:PluginInstall来安装。

例如,要安装一个名为vim-airline的状态栏美化插件:




Plugin 'vim-airline/vim-airline'

然后在VIM命令模式下运行:




:PluginInstall
  1. 主题安装

VIM主题可以提升编辑器的视觉体验。可以在Github上找到许多VIM主题。

例如,要安装vim-monokai主题:




git clone https://github.com/crusoexia/vim-monokai.git ~/.vim/bundle/vim-monokai

然后在.vimrc中设置主题:




syntax enable
set background=dark
colorscheme monokai
  1. 自定义状态栏

使用vim-airline插件可以自定义状态栏:




let g:airline_theme='monokai'

这些是配置和美化VIM的基本步骤,你可以根据自己的喜好安装更多插件和主题来进一步美化你的编辑环境。

2024-08-19

在Linux环境下,Shell 脚本是由 Shell 解释器来解释执行的。常见的 Shell 解释器有 bash、sh、csh 等。

以下是一个简单的 Shell 脚本示例,它会输出 "Hello, World!":




#!/bin/bash
echo "Hello, World!"

要运行这个脚本,你需要先确保它有执行权限。可以通过以下命令给予执行权限:




chmod +x script.sh

然后,你可以通过下面的命令来执行这个脚本:




./script.sh

这里的 #!/bin/bash 是一个 shebang,它告诉系统这个脚本应该由 /bin/bash 解释执行。echo 是一个内建命令,用于输出后面的字符串。

如果你想要探索 Shell 的实现原理,你可以查看 bash 的源代码。你可以在网上找到它的源码库,例如:https://github.com/bminor/bash,但是要注意,Shell 脚本的复杂性不适合在此解释。如果你想要编写自己的 Shell 或解释器,你需要了解编译原理、词法分析、语法分析等知识。

2024-08-19



#include <fcntl.h>
#include <unistd.h>
 
int main() {
    // 尝试打开文件
    int fd = open("/path/to/file", O_RDWR | O_CREAT, 0666);
    if (fd == -1) {
        // 文件打开失败,处理错误
        perror("open failed");
        return 1;
    }
 
    // 成功打开文件,使用文件描述符进行操作
    // ...
 
    // 完成操作后关闭文件
    if (close(fd) == -1) {
        // 关闭文件描述符失败,处理错误
        perror("close failed");
        return 1;
    }
 
    return 0;
}

这段代码展示了如何在Linux环境中使用标准的系统调用openclose来打开和关闭一个文件。open函数用于打开或创建一个文件,并返回一个文件描述符(fd),它是一个非负整数,用作后续I/O操作的标识。如果open函数成功,它返回一个新的文件描述符;如果失败,它返回-1。close函数用于关闭一个已经打开的文件描述符,释放相关资源。如果操作成功,它返回0;如果失败,它返回-1。

2024-08-19

getaddrinfo 函数是 POSIX 标准中定义的一个用于名字到地址的转换的函数,它可以处理各种类型的地址,包括IPv4和IPv6。它提供了一种将主机名、服务名和 hints 结构转换为 socket address 结构的方法。

函数原型如下:




#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
 
int getaddrinfo(const char *hostname, const char *service, const struct addrinfo *hints, struct addrinfo **result);

参数说明:

  • hostname: 主机名,可以是一个主机名,一个IP地址的字符串,或者是一个空指针。
  • service: 服务名,可以是一个服务名或者一个端口号的字符串,或者是一个空指针。
  • hints: 一个指向 addrinfo 结构体的指针,该结构体用于指定期望返回的信息类型。
  • result: 函数调用成功后,指向 addrinfo 结构体链表的指针,该链表保存了所有满足条件的结果。

返回值:

  • 0:成功。
  • 非0:出错,错误代码存储于 h_errno

下面是使用 getaddrinfo 函数的一个简单例子:




#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
 
int main(int argc, char *argv[]) {
    if (argc != 2) {
        printf("Usage: %s <hostname>\n", argv[0]);
        return 1;
    }
 
    struct addrinfo hints;
    struct addrinfo *result, *rp;
    int s;
 
    memset(&hints, 0, sizeof(struct addrinfo));
    hints.ai_family = AF_UNSPEC;    /* Allow IPv4 or IPv6 */
    hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */
 
    s = getaddrinfo(argv[1], "http", &hints, &result);
 
    if (s != 0) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(s));
        return 2;
    }
 
    for (rp = result; rp != NULL; rp = rp->ai_next) {
        void *addr;
        char *ipver;
 
        /* get the pointer to the address itself,
           different fields in IPv4 and IPv6: */
        if (rp->ai_family == AF_INET) { /* IPv4 */
            struct sockaddr_in *ipv4 = (struct sockaddr_in *)rp->ai_addr;
            addr = &(ipv4->sin_addr);
            ipver = "IPv4";
        } else { /* IPv6 */
            struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)rp->ai_addr;
            addr = &(ipv6->sin6_addr);
            ipver = "IPv6";
        }
 
        /* convert the IP to a string and print it */
        char ipstr[INET6_ADDRSTRLEN];
        inet_ntop(rp->ai_family, addr, ipstr, INET6_ADDRSTRLEN);
        printf("%s: %s\n", ipver, ipstr);
    }
 
    freeaddrinfo(result); /* free the linked-list structure */
    return 0;
}

这段代码会查询给定主机名的IP地址,并打印出IPv4和IPv6地址。如果查询成功