Skip to content

Linux 常见问题及解决方式

处理器架构核心概念解析

目前主流架构可分为 x86 系列(含32位/64位)和 ARM 系列(含32位/64位)。

核心架构对比与应用场景

架构位数指令集类型性能特点典型应用
x8632位CISC兼容性强,功耗较高早期PC、嵌入式设备
x86_6464位CISC高性能,支持大内存台式机、服务器、游戏主机
ARM32位RISC低功耗,中等性能智能手机、平板、物联网设备
AArch6464位RISC高能效比,扩展性强高端手机、ARM服务器、MacBook

常见概念辨析

AMD64x86_64:二者完全一致,AMD64是技术源头,x86_64为通用名称。 ARM64AArch64:ARM64是AArch64的俗称,均指ARM架构的64位版本。

兼容性问题:x86与ARM架构不兼容,软件需针对目标架构重新编译(如Windows RT仅支持ARM)。

如何判断设备架构类型

Windows系统:通过cmd命令行输入 systeminfo,在“系统类型”中查看(如“x64-based PC”表示x86_64)。

Linux系统:执行 uname -m,输出x86_64表示x86架构64位,aarch64表示ARM架构64位。

VMware 安装 Debian 踩坑记录

  1. 安装到 Configure the package manager 时,这里要选择 no, 不安装。否则会因为国内网络问题导致安装非常慢。
  2. 而后选择镜像源时,选择清华大学镜像源(mirrors.tuna.tsinghua.edu.cn),快,选 163 源也很慢。
  3. 选择安装的软件时(这里不安装桌面环境):
    1. 去掉勾选:Debian desktop environmentGNOME
    2. 增加勾选: SSH Server 和 standard system utilities(默认已勾选)
  4. Install the GRUB boot loader 时,选择 /dev/sda
  5. 用 root 用户在本机可以登录,但是通过 SSH 出现 X Authentication rejected 错误:
    1. 默认在 /etc/ssh/sshd_config 配置文件中有(虽然被注释着):PermitRootLogin prohibit-password
    2. 在 /etc/ssh/sshd_config.d/ 目录下增加一个格式为 *.conf 的文件,比如:default.conf
    3. 注意:这里是 sshd_config.d 文件夹,因为默认在 /etc/ssh/sshd_config 文件中导入了 /etc/ssh/sshd_config.d/ 目录下所有的 *.conf 文件。
    4. 在 default.conf 中通过 vi 命令加上一行内容:PermitRootLogin yes
    5. 保存后,退出。然后执行命令:systemctl restart ssh
    6. 此时,SSH 就可以用 root 用户登录了。

开机时网络自动打开(针对新安装的 CentOS,每次开启虚拟机,网络连接未打开,无法连接到互联网)

在虚拟机中以最小化方式安装 CentOS 7,后无法上网,因为 CentOS 7 默认网卡未激活。

bash
cd /etc/sysconfig/network-scripts/

# 进入编辑模式,将 ONBOOT=no 改为 ONBOOT=yes,就OK
vi ifcfg-enp0s3

# 保存后重启网卡:
service network restart

# 此时就可以上网了
ping www.baidu.com

ll: command not found

root 用户工作目录下默认有 .bashrc 隐藏文件,只需去掉这一行前面的 # 注释符:alias ll='ls $LS_OPTIONS -l'

其他用户的工作目录下默认没有这个文件,则需要新创建该文件,并且内容加上:alias ll='ls $LS_OPTIONS -l'

注:各个用户只管各个用户自己的,比如改了 root 用户下的文件,那就只有 root 用户可以使用 ll 命令,其他用户依然不能使用,想要使用就需要每个用户都更改。

shell
cd ~

vim ~/.bashrc
# 编辑内容后,保存,退出

# 生效
source ~/.bashrc

Another app is currently holding the yum lock; waiting for it to exit

shell
rm -f /var/run/yum.pid

Cannot find a valid baseurl for repo: base/7/x86_64

网络设置好,重启系统。

jar 应用后台运行

bash
# 不需要日志输出时推荐(比如:用 spring boot 自己的日志时)
nohup java $JVM_OPTS -jar app.jar > /dev/null 2>&1 &

# 需要日志时推荐(比如: 没有用  spring boot 来生成日志时,那么此时这种方式会得到日志)
nohup java $JVM_OPTS -jar app.jar > app.log 2>&1 &

命令各部分详解

shell
nohup java $JVM_OPTS -jar app.jar > /dev/null 2>&1 &

这个命令是一个典型的Java应用后台启动命令,下面我来详细解析每个部分:

1. nohup

  • 作用:忽略挂起信号(Hangup Signal)
  • 功能:确保即使终端关闭或用户退出登录,Java进程也不会被终止
  • 原理:阻止系统向进程发送SIGHUP信号

2. java $JVM_OPTS -jar app.jar

  • java:Java虚拟机启动器

  • $JVM_OPTS:环境变量,通常包含JVM参数,如:

    bash
    # 示例 JVM_OPTS 内容
    export JVM_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"
  • -jar app.jar:指定要运行的 JAR 包

3. > /dev/null

  • 作用:将标准输出重定向到空设备
  • 效果:所有正常输出内容都会被丢弃,不会保存到任何文件
  • /dev/null:Linux中的特殊设备文件,写入它的所有数据都会被丢弃

4. 2>&1

  • 作用:将标准错误重定向到标准输出
  • 分解
    • 2:文件描述符2,代表标准错误输出
    • &1:指向文件描述符1(标准输出)的位置
  • 效果:错误信息也会被重定向到 /dev/null

5. &

  • 作用:在后台运行命令
  • 效果:立即返回命令行提示符,进程在后台继续运行

命令执行效果

bash
# 执行后:
[1] 12345  # 返回作业号和进程ID

# 此时:
# - Java进程在后台运行(进程ID 12345)
# - 所有输出(正常和错误)都被丢弃
# - 终端关闭后进程继续运行

实际应用场景

这种配置适用于:

  1. 无日志需求的应用:不需要查看任何输出
  2. 日志已内部处理:应用自己有完善的日志框架(Logback/Log4j2)
  3. 资源受限环境:避免产生额外的日志文件

常用变体

1. 保存日志到文件

bash
# 保存所有输出到文件
nohup java $JVM_OPTS -jar app.jar > app.log 2>&1 &

# 分别保存标准输出和错误输出
nohup java $JVM_OPTS -jar app.jar > app.out 2> app.err &

2. 追加到现有日志文件

bash
nohup java $JVM_OPTS -jar app.jar >> app.log 2>&1 &

3. 只保存错误日志

bash
nohup java $JVM_OPTS -jar app.jar > /dev/null 2> error.log &

检查运行状态

bash
# 查看后台作业
jobs -l

# 查看Java进程
ps aux | grep java

# 查看特定进程
ps -p 12345 -o pid,cmd,%cpu,%mem

注意事项

⚠️ 重要提醒

  • 使用 > /dev/null 2>&1 意味着所有日志都会丢失
  • 生产环境不建议完全丢弃日志
  • 如果应用崩溃,将无法通过日志排查问题
  • 建议至少保留错误日志用于问题诊断

这个命令组合确保了Java应用在后台稳定运行,同时完全屏蔽了所有控制台输出。

.sh 脚本后台运行

shell
# 自定义输出文件(推荐) 
nohup ./test.sh > script.log 2>&1 &


# 解释: 
# > script.log :标准输出(stdout)重定向到 script.log  
# 2>&1:标准错误(stderr)重定向到 stdout,最终都写入 script.log  
# &:后台运行

查看进程和刷新控制台日志

shell
# 显示出所有的java进程,去除掉当前的grep进程。
ps -ef|grep java|grep -v grep

# 同步刷新,查看日志最后200行
tail -fn 200 console.log