Post

Linux 面试题精选(Unity 开发者视角版)

适用人群:从 Unity 游戏开发转行到后端/运维/DevOps/云原生等方向的开发者 特色:每道题附带「Unity 开发者转行视角」分析,教你如何结合游戏开发经验回答,打造差异化优势 一、基础命令类(高频必考题)

先搞技术 阅读 13 点赞 0 评论 1

适用人群:从 Unity 游戏开发转行到后端/运维/DevOps/云原生等方向的开发者 特色:每道题附带「Unity 开发者转行视角」分析,教你如何结合游戏开发经验回答,打造差异化优势


一、基础命令类(高频必考题)

1. 如何查看当前目录下所有文件(包括隐藏文件)?

参考答案: 使用 ls -als -al(查看详细信息)

  • -a:显示所有文件,包括以 . 开头的隐藏文件

  • -l:以长格式显示,包含权限、所有者、大小、时间等信息

Unity 开发者转行视角

这就像在 Unity 中查看 Project 窗口,默认情况下你看不到 .meta 文件和隐藏的 Library 文件夹。ls -a 就相当于开启了「显示所有文件」选项,让你能看到工程里的全部内容,包括 Unity 自动生成的那些隐藏文件。我在做 Unity 项目版本控制时,经常需要检查哪些文件应该被 git 忽略,这和 Linux 下查看隐藏文件的思路是一样的。


2. 如何查找某个文件的位置?

参考答案: 常用有三种方式:

  1. find /path -name "filename":递归搜索,功能最强大

  2. locate filename:基于数据库搜索,速度快但可能不是最新

  3. which command:查找可执行文件的位置

Unity 开发者转行视角

这让我想到 Unity 里的 AssetDatabase.FindAssets()GameObject.Find()find 命令就像递归遍历整个目录树,类似你在 Unity 里用脚本搜索所有 Prefab;locate 则更像 Unity 的 AssetDatabase 缓存查询,速度快但依赖索引更新。我在优化 Unity 项目资源加载时,经常需要快速定位资源文件位置,这个思路是相通的。


3. 如何查看文件内容?有哪些常用命令?

参考答案

  • cat filename:一次性显示全部内容,适合小文件

  • more / less:分页查看,适合大文件(less 更强大,支持上下滚动)

  • head -n 10 filename:查看前 10 行

  • tail -n 10 filename:查看最后 10 行

  • tail -f filename:实时追踪文件末尾新增内容

Unity 开发者转行视角

这就像 Unity 编辑器里查看不同类型的资源。cat 像直接打开一个小脚本全文查看;tail -f 则非常像 Unity 的 Console 窗口实时输出日志——我以前调试 Unity 游戏时,就经常盯着 Console 看实时的 Debug 输出,tail -f 看服务器日志也是同样的感觉,都是实时追踪程序运行状态。


4. 如何复制、移动、删除文件?

参考答案

  • 复制:cp source destination,复制目录用 cp -r

  • 移动/重命名:mv source destination

  • 删除:rm filename,删除目录用 rm -rf directory(慎用!)

Unity 开发者转行视角

这些操作和 Unity 里的资源操作几乎一一对应:cp 就像 Duplicate 复制资源,mv 就像在 Project 窗口里拖放移动文件或按 F2 重命名,rm 就像 Delete 删除。不过有一点不同——Linux 里 rm -rf 是真删,不像 Unity 还有回收站可以恢复,这也是我转行后特别注意的,就像游戏里删存档前一定要备份一样。


5. 如何查看命令的帮助信息?

参考答案

  • man command:查看命令的完整手册(manual)

  • command --help:查看命令的简要帮助信息

  • info command:查看 info 格式的文档(比 man 更详细)

Unity 开发者转行视角

这就像 Unity 开发时查 Scripting API 文档。man 命令就像官方的完整 API 手册,什么都有但有时候信息太多;--help 就像快速提示,告诉你常用参数有哪些。我写 Unity 代码时养成了查官方文档的习惯,这个习惯在学 Linux 时特别有用,遇到不确定的参数先 --help 一下,效率很高。


6. 如何统计文件的行数、字数、字符数?

参考答案: 使用 wc 命令(word count):

  • wc -l filename:统计行数

  • wc -w filename:统计单词数

  • wc -c filename:统计字符数

Unity 开发者转行视角

这让我想到 Unity 项目里统计代码量。我以前写过编辑器工具来统计整个项目的 C# 脚本行数,用来评估项目规模。wc -l 就是 Linux 下的代码行数统计工具,配合 find 命令可以批量统计,和我写的 Unity 统计工具思路一样——都是遍历文件 + 计数。


二、文件系统与权限类

7. 什么是软链接、硬链接?简单说明区别?

参考答案

  • 软链接(符号链接):类似 Windows 的快捷方式,是一个独立的文件,指向源文件路径。源文件删除后,软链接失效(变成"断链")。可以跨文件系统,可以链接目录。创建命令:ln -s 源文件 链接名

  • 硬链接:是源文件的一个别名,指向同一个 inode(文件的物理索引)。源文件删除后,硬链接依然可以正常访问内容。不能跨文件系统,不能链接目录。创建命令:ln 源文件 链接名

Unity 开发者转行视角

这个概念我用 Unity 的 Prefab 来理解就特别清楚:

  • 硬链接就像同一个 Prefab 的多个实例,它们本质上都指向同一个 Prefab 资源,修改 Prefab 所有实例都会变,删掉一个实例不影响其他实例和 Prefab 本身

  • 软链接就像 Prefab Variant 或者只是一个引用,源 Prefab 没了,这个引用也就失效了

我在做 Unity 资源管理时经常处理这类引用关系,所以理解硬链接和软链接的区别特别快,本质上都是「引用 vs 副本」的概念。


8. Linux 文件权限怎么看?rwx 分别代表什么?

参考答案: 用 ls -l 查看,权限分为三组:所有者(user)、所属组(group)、其他用户(other)

  • r(read):读权限,数字表示 4

  • w(write):写权限,数字表示 2

  • x(execute):执行权限,数字表示 1

例如 chmod 755 file 表示:所有者 rwx (7),组 rx (5),其他 rx (5)

Unity 开发者转行视角

这就像 Unity 项目的多人协作权限管理。比如我们团队用 Perforce 或 Git 时,不同角色有不同权限:

  • 主程有「读写执行」权限(7):可以改代码、提交、执行构建脚本

  • 美术有「读+写资源」权限:可以修改美术资源但不能碰代码

  • 实习生只有「读」权限(4):只能看不能改

数字权限的计算方式也很有意思,4+2+1 的组合就像位运算,我写 Unity 代码时经常用 LayerMask 和枚举的 Flags 属性,都是同样的二进制位运算思路,所以一学就会。


9. 如何修改文件权限和所有者?

参考答案

  • 修改权限:chmod,例如 chmod 755 file.shchmod +x script.sh

  • 修改所有者:chown user:group filename,需要 root 权限

  • 修改所属组:chgrp groupname filename

Unity 开发者转行视角

这就像 Unity 项目里的资源权限管理。chmod 就像给不同角色设置资源的访问权限,比如给策划开放配置表的读写权限;chown 就像把资源的负责人从 A 转给 B,比如某个系统交接了,对应的脚本负责人也要改。

印象特别深的是,我第一次部署 Unity 游戏的 Linux 服务器版时,因为构建脚本没有执行权限(没加 chmod +x),卡了半小时,后来才想起来 Linux 下文件默认没有执行权限,这和 Windows 下 .exe 直接能跑不一样。


10. Linux 目录结构是怎样的?/etc、/var、/usr 这些目录是干什么的?

参考答案: Linux 遵循 FHS(文件系统层次结构标准):

  • /:根目录,所有文件的起点

  • /etc:系统配置文件(etc = "et cetera",现在理解为 configuration)

  • /var:可变数据文件,如日志(/var/log)、缓存、数据库文件

  • /usr:用户程序和数据(Unix System Resources),如 /usr/bin、/usr/lib

  • /home:用户主目录

  • /root:root 用户的主目录

  • /tmp:临时文件,重启后会清空

  • /dev:设备文件,如 /dev/sda(硬盘)

Unity 开发者转行视角

我用 Unity 项目目录结构来类比,一下子就记住了:

  • /etc 就像 Unity 项目的 ProjectSettings 文件夹,存各种配置

  • /var/log 就像 Unity 的 Logs 文件夹,存运行日志

  • /usr/bin 就像 Unity 编辑器的安装目录,放各种可执行工具

  • /tmp 就像 Unity 的 Temp 文件夹,临时文件,删了也没关系

  • /home 就像每个用户自己的工程目录,各管各的

理解了这个类比,我就不会像刚接触时那样到处乱找文件了,知道什么类型的文件该去什么目录找。


三、进程与系统管理类

11. 如何查看系统中运行的进程?

参考答案

  • ps aux:查看所有进程的详细信息

  • ps -ef:另一种格式的进程查看

  • top:实时显示进程状态,类似任务管理器

  • htop:top 的增强版,更友好(需要安装)

  • pstree:以树状图显示进程关系

Unity 开发者转行视角

这就像 Unity 编辑器的 Profiler 窗口!top 命令就是 Linux 版的任务管理器,实时显示 CPU、内存占用,和 Unity Profiler 看每帧耗时、内存分配是一个感觉。

我以前优化 Unity 游戏性能时,经常用 Profiler 找哪个函数占 CPU 最高;现在排查服务器性能问题,也是用 top 找哪个进程吃资源最多。思路完全一样——先找瓶颈,再优化。

还有 ps aux 就像 Unity 的 Hierarchy 窗口,列出所有"活着"的对象(进程),能看到它们的状态和资源占用。


12. 如何终止一个进程?

参考答案

  • kill PID:发送 TERM 信号(15),让进程正常退出(温和方式)

  • kill -9 PID:发送 KILL 信号(9),强制杀死进程(暴力方式)

  • killall process_name:按进程名杀死所有同名进程

  • pkill pattern:按模式匹配杀死进程

Unity 开发者转行视角

这就像 Unity 里停止游戏运行:

  • 正常点击停止按钮 = kill(给进程一个清理的机会)

  • 直接强制关闭 Unity = kill -9(不管当前状态,直接干掉)

我以前调试 Unity 时遇到过编辑器卡死,只能强制结束进程;现在服务器上遇到进程挂死了,也是用 kill -9。都是同样的思路:先尝试正常退出,不行再强杀。

还有一个有趣的类比:Unity 里的 Destroy(gameObject)DestroyImmediate() 的区别,就像 killkill -9 的区别——一个是等这帧结束后销毁,一个是立刻销毁。


13. 什么是僵尸进程?什么是孤儿进程?

参考答案

  • 僵尸进程(Zombie):子进程已经结束,但父进程没有调用 wait() 回收资源,子进程的 PCB(进程控制块)还留在系统中。状态为 Z。

  • 孤儿进程(Orphan):父进程先退出了,子进程还在运行,被 init 进程(PID=1)收养。

Unity 开发者转行视角

这个我用 Unity 的父子对象关系来理解:

  • 僵尸进程就像一个 GameObject 已经被 Destroy 了,但它的引用还被别的对象持有,GC 回收不了——对象"死了但灵魂还在",占着内存

  • 孤儿进程就像父对象被删了,但子对象设置了 DontDestroyOnLoad,场景切换后子对象还活着,变成了"野孩子"

我以前写 Unity 代码时经常处理对象生命周期的问题,比如协程没停止导致的内存泄漏,和僵尸进程的本质是一样的——都是生命周期管理不当,该回收的没回收。


14. 如何查看系统资源使用情况(CPU、内存、磁盘)?

参考答案

  • CPU:tophtopvmstat

  • 内存:free -htop

  • 磁盘:df -h(查看磁盘使用量)、du -sh 目录(查看目录大小)

  • 综合:vmstatiostat(IO 情况)

Unity 开发者转行视角

这一套工具就像 Unity 的 Profiler 全套工具:

  • top / htop = CPU Profiler,看 CPU 占用

  • free -h = Memory Profiler,看内存使用

  • df -h / du = 看磁盘/包体大小,就像我以前看 Unity 打包后的包体有多大,哪些资源占空间

  • iostat = 看磁盘 IO,就像看资源加载时的磁盘读取瓶颈

我以前做 Unity 性能优化时的思路是:先看 CPU 瓶颈还是内存瓶颈,再定位到具体函数/资源。现在做服务器性能排查也是同样的方法论,工具名字变了,但分析思路完全可以复用。


15. 什么是守护进程(daemon)?

参考答案: 守护进程是在后台运行的特殊进程,不依附于终端,随系统启动而启动,随系统关闭而关闭。通常用于提供服务,如 httpd、sshd、mysqld 等。命名通常以 d 结尾(daemon 的缩写)。

Unity 开发者转行视角

守护进程就像 Unity 里的 DontDestroyOnLoad 单例对象——它在后台一直运行,不受场景切换影响,整个游戏生命周期都存在。

比如游戏里的音频管理器、网络管理器,都是从游戏启动到结束一直在后台跑的,这就对应 Linux 里的 sshd、nginx 这些守护进程,从系统启动到关机一直在后台提供服务。

我以前写 Unity 单例时还要处理好初始化和销毁的时机,守护进程也是一样,需要正确处理启动和停止的逻辑。


四、网络与安全类

16. 如何查看网络是否连通?

参考答案

  • ping 目标地址:测试网络连通性(ICMP 协议)

  • telnet 主机 端口:测试端口是否开放

  • nc -zv 主机 端口:netcat 测试端口

  • curl 地址:测试 HTTP 服务是否可用

Unity 开发者转行视角

这就像 Unity 里测试网络连接:

  • ping 就像游戏客户端发个心跳包给服务器,看能不能收到回应

  • telnet 测端口就像测试服务器的某个服务端口有没有开,比如游戏服务器的 8080 端口

  • curl 就像用 UnityWebRequest 发个 HTTP 请求,看接口通不通

我以前做 Unity 网络游戏开发时,经常要排查连接问题:是网络不通?还是端口没开?还是服务挂了?这个排查思路在 Linux 下完全一样,工具不同但方法论相同。


17. 如何查看系统的网络连接状态?

参考答案

  • netstat -tulnp:查看所有监听的端口和进程

  • ss -tulnp:更现代的工具,比 netstat 快

  • netstat -an:查看所有网络连接

  • lsof -i :端口号:查看哪个进程占用了某个端口

Unity 开发者转行视角

这就像 Unity 里的网络调试工具,查看有哪些客户端连上来了、每个连接的状态是什么。

我以前做游戏服务器开发时,经常要查:这个端口被谁占了?有多少玩家在线?连接是 ESTABLISHED 还是 TIME_WAIT?这些概念和 netstat 输出的状态是一一对应的。

还有 lsof -i :端口 这个命令特别实用,就像我在 Unity 里找哪个脚本在占用某个音频资源一样——找到占用者,才能解决端口冲突问题。


18. 什么是 SSH?如何使用?

参考答案: SSH(Secure Shell)是一种加密的网络协议,用于安全地远程登录和执行命令。

  • 登录:ssh user@hostname

  • 指定端口:ssh -p 2222 user@hostname

  • 密钥登录:生成密钥对 ssh-keygen,把公钥放到服务器的 ~/.ssh/authorized_keys

Unity 开发者转行视角

SSH 对我来说就像 Unity 的远程调试功能——可以在本地连接到远程的机器上,控制它运行代码、查看状态。

我以前做 Unity 手游开发时,经常需要连接到测试机上看日志、调试;现在做服务器开发,用 SSH 连接到远程服务器也是一样的感觉——都是远程控制 + 调试。

还有密钥登录这个概念,就像 Unity 的 License 授权——有了授权文件才能用,比账号密码更安全,也更方便,不用每次都输密码。


19. 如何在 Linux 之间传输文件?

参考答案

  • scp:基于 SSH 的文件传输,scp 本地文件 user@host:远程路径

  • rsync:增量同步,适合大文件和频繁同步,rsync -avz 源 目标

  • sftp:FTP 的安全版本,交互式传输

  • wget / curl:从网络下载文件

Unity 开发者转行视角

这些工具就像 Unity 项目里的资源同步工具:

  • scp 就像直接把文件拖过去,简单粗暴

  • rsync 就像 AssetBundle 的增量更新——只传变化的部分,省流量又快。我以前做 Unity 热更新时,就是对比资源的 MD5,只下载变化的 AB 包,rsync 也是同样的增量同步思路

我第一次用 rsync 时就觉得特别亲切,因为和热更新的原理一模一样,都是"只同步差异",这个思路我太熟了。


20. 防火墙是什么?如何配置?

参考答案: 防火墙用于控制网络进出流量,常见的有:

  • iptables:传统的 Linux 防火墙工具

  • firewalld:CentOS/RHEL 默认的防火墙管理工具

  • ufw:Ubuntu 默认的简化防火墙工具

常用操作:开放端口、关闭端口、允许/拒绝 IP 等。

Unity 开发者转行视角

防火墙就像游戏服务器的白名单/黑名单系统——控制谁能连进来、能访问哪些端口。

我以前做游戏运营时,经常要配置服务器的安全策略:只开放游戏端口和 GM 后台端口,屏蔽恶意 IP。这和防火墙的工作原理完全一样,都是基于 IP 和端口的访问控制。

还有一个有趣的类比:防火墙的 INPUT/OUTPUT/FORWARD 链,就像 Unity 里的消息管道——进来的消息、出去的消息、转发的消息,每个环节都可以加过滤规则。


五、Shell 脚本与自动化类

21. 什么是 Shell?常见的 Shell 有哪些?

参考答案: Shell 是用户和内核之间的接口,是命令解释器,也是脚本编程语言。 常见的有:

  • bash(Bourne Again Shell):最常用,Linux 默认

  • sh(Bourne Shell):最原始的 Shell

  • zsh:功能更强大,带自动补全等

  • fish:友好的交互式 Shell

Unity 开发者转行视角

Shell 就像 Unity 编辑器的命令行(Editor Console)+ 编辑器脚本(Editor Script)的结合体:

  • 交互式 Shell 就像 Unity 的 Immediate 窗口,可以输入命令立刻执行

  • Shell 脚本就像 Unity 的 Editor 脚本,把一系列操作写成脚本批量执行

我以前写过很多 Unity 编辑器工具脚本,比如一键打包、批量处理资源。现在写 Shell 脚本也是同样的目的——把重复的操作自动化,提高效率。只是语法不同,思路完全一样。


22. Shell 脚本中如何定义变量?如何使用?

参考答案

# 定义变量(等号两边不能有空格)
name="Linux"
age=30
​
# 使用变量(加 $)
echo $name
echo ${name}  # 推荐,更清晰

Unity 开发者转行视角

Shell 变量和 C# 变量的用法很像,就是语法不一样:

  • C# 里是 string name = "Linux";

  • Shell 里是 name="Linux"(不能有空格,这点一开始很不习惯)

还有 ${name} 这种写法,就像 C# 里的字符串插值 $"{name}",都是把变量嵌入到字符串里。

我刚开始写 Shell 脚本时,经常在等号两边加空格,然后报错。后来我就告诉自己:Shell 脚本里变量赋值就像 Unity 里给 Inspector 面板拖变量——直接赋值,不要空格。


23. Shell 脚本中的条件判断怎么写?

参考答案

if [ 条件 ]; then
    # 执行语句
elif [ 条件 ]; then
    # 执行语句
else
    # 执行语句
fi

常见条件:

  • 字符串:=, !=, -z(空串)

  • 数字:-eq(等于), -gt(大于), -lt(小于)

  • 文件:-f(是文件), -d(是目录), -e(存在)

Unity 开发者转行视角

if 语句的结构和 C# 差不多,就是语法细节不同:

  • C# 里是 if (condition)

  • Shell 里是 if [ condition ](注意中括号两边必须有空格,这个坑我踩过很多次)

还有那些 -eq-gt 什么的,一开始觉得麻烦,后来我就把它们和 Unity 里的 Mathf.Approximately()CompareTag() 这类比较函数类比,都是专门的比较方式,不是直接用运算符。

文件判断那部分就更熟了,我写 Unity 工具脚本时经常要判断文件存不存在、是不是目录,用的就是 File.Exists()Directory.Exists(),和 Shell 的 -e-d 一一对应。


24. Shell 脚本中的循环怎么写?

参考答案: for 循环:

for i in 1 2 3 4 5; do
    echo $i
done
​
# 或者 C 语言风格
for ((i=0; i<10; i++)); do
    echo $i
done

while 循环:

while [ 条件 ]; do
    # 循环体
done

Unity 开发者转行视角

循环结构和 C# 几乎一样,就是语法稍微不同。

for i in ... 这种遍历列表的写法,就像 C# 里的 foreach,遍历集合中的每个元素。我以前写 Unity 工具时经常用 foreach 遍历所有选中的资源批量处理,现在写 Shell 脚本也是用 for 循环批量处理文件,思路完全相同。

还有 C 语言风格的 for 循环,和 C# 的 for 循环简直一模一样,学起来毫无压力。


25. 什么是管道(pipe)?有什么用?

参考答案: 管道用 | 表示,把前一个命令的输出作为后一个命令的输入。 例如:ps aux | grep nginx —— 列出所有进程,然后筛选出包含 nginx 的行。

管道是 Linux 设计哲学的重要体现:每个工具只做一件事,做好一件事,通过管道组合起来完成复杂任务。

Unity 开发者转行视角

管道这个概念太妙了,我第一次见到就想到了 Unity 的 ScriptableObject 事件系统,或者是责任链模式——每个节点处理完传给下一个。

更形象的类比是 Unity 的 Shader 流水线:顶点着色器的输出传给片元着色器,每个阶段只做自己的事,组合起来完成复杂的渲染。Linux 管道也是一样:ps 负责列进程,grep 负责筛选,wc 负责计数,用管道串起来就能统计 nginx 有多少个进程。

我以前写 Unity 编辑器工具时,也喜欢把功能拆成小模块,然后组合调用。这个"小而美 + 组合"的设计哲学,我在 Unity 开发中就一直在用,所以特别认同 Linux 的管道思想。


26. grep 命令怎么用?有哪些常用参数?

参考答案: grep 用于在文件中搜索匹配的字符串:

  • grep "pattern" filename:在文件中查找

  • grep -r "pattern" 目录:递归搜索目录下所有文件

  • grep -i "pattern" filename:忽略大小写

  • grep -v "pattern" filename:反向匹配(不包含的行)

  • grep -n "pattern" filename:显示行号

Unity 开发者转行视角

grep 就像 Unity 编辑器里的「在文件中查找」功能(Ctrl+Shift+F)——可以在整个项目里搜索某个关键词,找到所有出现的地方。

我以前改 Unity 项目代码时,经常要全局搜索某个函数名或者变量名,看哪些地方用到了。现在用 grep 也是一样的目的:找配置、找日志、找代码引用。

特别是 grep -r 递归搜索,就像 Unity 的全局搜索;grep -n 显示行号,就像搜索结果里显示在第几行。这些功能我天天用,太熟悉了。


六、软件包与服务管理类

27. Linux 下如何安装软件?

参考答案: 不同发行版用不同的包管理器:

  • Debian/Ubuntu 系:apt(Advanced Package Tool)

    • apt update:更新软件源

    • apt install 包名:安装软件

    • apt remove 包名:卸载软件

    • apt search 关键词:搜索软件包

  • CentOS/RHEL 系:yumdnf

  • 还有源码编译安装、二进制包直接运行等方式。

Unity 开发者转行视角

包管理器就像 Unity 的 Asset Store 或者 Package Manager:

  • apt search 就像在 Asset Store 里搜插件

  • apt install 就像一键导入插件,自动帮你装好

  • apt remove 就像删除插件

  • apt update 就像刷新 Package Manager 的列表,看看有什么新版本

最爽的是依赖自动处理——安装一个软件,它依赖的库会自动帮你装上。这就像 Unity 安装插件时自动帮你导入依赖的资源一样,不用你自己一个个找。

我以前装 Unity 插件还要手动处理依赖,现在用 apt 觉得太方便了,这个思路其实是一样的,只是 Linux 做得更成熟。


28. systemd 是什么?如何管理服务?

参考答案: systemd 是现代 Linux 系统的初始化系统(init 系统),用于管理系统服务。 常用命令:

  • systemctl start 服务名:启动服务

  • systemctl stop 服务名:停止服务

  • systemctl restart 服务名:重启服务

  • systemctl status 服务名:查看服务状态

  • systemctl enable 服务名:设置开机自启

  • systemctl disable 服务名:取消开机自启

Unity 开发者转行视角

systemd 就像 Unity 游戏里的 GameManager——负责管理整个游戏的各个系统(服务)的启动、停止、状态。

每个服务就像游戏里的一个子系统:音频系统、网络系统、UI 系统。GameManager 控制它们什么时候启动、什么时候停止、是不是一直开着。

systemctl enable 设置开机自启,就像把某个系统设为游戏启动时自动初始化;systemctl status 看状态,就像在调试面板里看各个系统是不是正常运行。

我以前写 Unity 框架时也设计过类似的服务管理器,所以理解 systemd 特别快,就是个大管家嘛。


29. 如何查看服务日志?

参考答案: 用 journalctl 查看 systemd 管理的服务日志:

  • journalctl -u 服务名:查看某个服务的日志

  • journalctl -f -u 服务名:实时追踪日志

  • journalctl --since "2024-01-01" --until "2024-01-02":按时间范围查看

传统日志文件在 /var/log/ 目录下,用 tail -f 查看。

Unity 开发者转行视角

查看日志就像 Unity 里看 Console 输出:

  • journalctl -u 服务名 就像在 Console 里按标签筛选,只看某个系统的日志

  • journalctl -f 就像打开 Console 实时看新输出,和 tail -f 是一个感觉

  • 按时间筛选就像 Unity Profiler 看某一帧的日志

我以前调试 Unity 游戏时,日志是最重要的排查手段;现在做服务器开发,日志同样是排障第一工具。养成打日志、看日志的习惯,走到哪里都好用。


七、综合与场景题

30. 说说你在 Linux 下部署项目的完整流程?

参考答案: 以部署一个 Web 服务为例:

  1. 环境准备:安装必要的软件(Nginx、Python/Node/Java 等运行环境、数据库)

  2. 上传代码:用 scp/rsync/git 把项目代码传到服务器

  3. 配置文件:修改配置(数据库连接、端口、环境变量等)

  4. 安装依赖:安装项目依赖的库和包

  5. 启动服务:启动应用服务,配置成 systemd 服务实现开机自启

  6. 配置反向代理:配置 Nginx 反向代理,绑定域名,配置 HTTPS

  7. 防火墙配置:开放需要的端口

  8. 测试验证:访问测试,看日志确认一切正常

  9. 监控告警:配置监控和日志收集

Unity 开发者转行视角

这个流程我太熟了,就像 Unity 游戏打包上线的流程:

  1. 环境准备 = 准备打包环境,装必要的 SDK、插件

  2. 上传代码 = 把最新代码合到发布分支

  3. 配置文件 = 改打包配置,切换到正式环境的 AppID、服务器地址

  4. 安装依赖 = 导入必要的 AssetBundle 和资源

  5. 启动服务 = 打出来的包运行起来,配置成开机自启就像游戏设置成开机自动运行

  6. 配置反向代理 = 配置 CDN 和负载均衡,就像游戏的资源 CDN 分发

  7. 防火墙配置 = 配置服务器安全组,只开必要端口

  8. 测试验证 = 测试服验证,QA 测试

  9. 监控告警 = 接 Bugly 或其他崩溃监控,有问题告警

整个流程的思路和游戏发布是一模一样的,只是具体工具和术语不同。我做过很多次 Unity 游戏打包发布,所以理解服务器部署流程特别快,本质上都是「把代码放到正确的地方,配置好,跑起来,监控着」。


31. 服务器磁盘满了,你怎么排查?

参考答案: 排查思路:

  1. df -h:确认是哪个分区满了

  2. du -sh /*:看根目录下哪个目录最大,逐层往下找

  3. 常见大文件:日志文件(/var/log)、缓存文件、数据库文件、用户上传文件

  4. 处理方式:清理无用日志、删除过期文件、扩容磁盘、日志轮转配置

Unity 开发者转行视角

这就像 Unity 项目打包后包体太大,需要瘦身的排查过程:

  1. 先看整体包体有多大 = df -h

  2. 然后看是哪个资源文件夹占空间最大 = du -sh 逐层找

  3. 常见元凶:纹理贴图、音频文件、视频 = 日志、缓存、数据库

  4. 处理方式:压缩纹理、降低音频码率、删除无用资源 = 清理日志、删过期文件、扩容

我以前优化 Unity 包体时,就是这样一层层往下找,找到占空间最大的资源再优化。排查磁盘空间问题也是同样的思路——从大到小,逐层定位,找到瓶颈再处理。


32. 服务器 CPU 占用很高,怎么排查?

参考答案: 排查思路:

  1. top / htop:找到哪个进程 CPU 高

  2. 看进程状态:是正常的业务高峰,还是异常的死循环/内存泄漏

  3. ps -mp PID -o THREAD,tid,time:看进程内哪个线程占 CPU 高

  4. 结合日志和代码分析:看程序在做什么,是不是有死循环、频繁 GC、计算量太大

  5. 处理:优化代码、扩容、限流等

Unity 开发者转行视角

这和 Unity 游戏性能优化的排查流程完全一样:

  1. 用 Profiler 看哪帧 CPU 高 = top 看哪个进程占 CPU

  2. 看是正常的场景复杂,还是有 Bug = 看是业务高峰还是异常

  3. 看 Profiler 里哪个函数耗时最高 = 看哪个线程/函数占 CPU

  4. 分析代码,看是不是有死循环、频繁 Instantiate、GC 太多 = 结合日志代码分析

  5. 优化代码、降特效、分帧处理 = 优化代码、扩容、限流

我做过很多次 Unity 性能优化,从 CPU 到内存到 DrawCall,这套排查方法论已经刻在脑子里了。现在用到服务器上,只是工具从 Unity Profiler 换成了 top/htop/strace,分析思路是完全通用的。


八、面试加分项:Unity 转行的独特优势

为什么 Unity 开发者转行有优势?

  1. 工程思维扎实:Unity 开发涉及图形、物理、网络、UI、性能优化等多个领域,知识面广,学习能力强

  2. 性能优化经验丰富:游戏对性能要求极高,Unity 开发者都有丰富的 CPU/内存/IO 优化经验,这些经验完全可以迁移到服务器开发

  3. 调试能力强:游戏 Bug 千奇百怪,Unity 开发者都有很强的问题排查和调试能力

  4. 工具思维好:Unity 开发者经常写编辑器工具提升效率,自动化意识强,写 Shell 脚本上手快

  5. 跨平台经验:Unity 要适配 PC/手机/主机等多个平台,对不同系统的差异有体感,学 Linux 更快

面试时可以这样说:

"虽然我之前是做 Unity 游戏开发的,但我觉得很多经验是可以迁移的。比如性能优化方面,我在 Unity 里经常用 Profiler 分析 CPU 和内存瓶颈,这套分析方法用到服务器上是一样的,只是工具从 Unity Profiler 换成了 top 和 vmstat。还有自动化方面,我以前写过很多编辑器工具来提升团队效率,现在写 Shell 脚本做运维自动化也是同样的思路。而且游戏开发对稳定性和性能的要求很高,这让我养成了严谨的编码习惯和很强的问题排查能力,我相信这些能力在新的岗位上同样有价值。"


总结

Linux 面试题看起来多,但核心概念和思路是相通的。作为 Unity 开发者转行,你最大的优势不是记住了多少命令,而是能把游戏开发的工程经验和思维方式迁移过来,形成自己的差异化竞争力。

面试时不要怕说自己是转行的,反而可以主动把话题往「经验迁移」上引——用 Unity 的例子来解释 Linux 概念,既能展示你对概念的理解深度,又能体现你的学习能力和过往经验的价值。

祝你面试顺利!🎮🐧

评论