Linux最佳实践和技巧

Share

该资源包含由Toptal网络成员提供的Linux最佳实践和Linux技巧的集合.

该资源包含由Toptal网络成员提供的Linux最佳实践和Linux技巧的集合. As such, 本页将定期更新,以包括更多的信息和涵盖新兴的Linux技术. 这是一个社区驱动的项目, 所以我们也鼓励你们做出贡献, 我们期待着你们的反馈.

Linux功能强大、灵活,可以适应广泛的用途. 由于操作系统的普及,管理Linux服务器的最佳实践并不难找到, 总是需要最新的Linux建议, 以及最好的建议, 来自我们经验丰富的Toptal Linux管理员.

关于Linux的更多信息,请查看Toptal资源页面 job description and Linux 面试问题.

推荐后端开发人员使用哪种服务器Linux发行版?

我们讨论了桌面Linux发行版,那么服务器发行版呢? 桌面Linux发行版主要关注GUI, 桌面环境, 简单是为了吸引更多的新用户. 另一方面,服务器Linux发行版主要关注稳定性和安全性. GUI不是一个重要的因素, 因为它们经常以“无头模式”(没有监视器的服务器)运行, 键盘或鼠标), 用户(开发人员)通过终端远程连接服务器. 另一个原因是GUI元素占用了宝贵的内存, 每一点空闲内存都是非常宝贵的. 稳定性和安全性我们不需要解释,每个人都希望他们的应用程序安全可用.

那么,您应该选择哪个服务器Linux发行版呢?

  • Debian 被硬编码系统管理员认为是最稳定的服务器操作系统,因为它非常稳定的发布周期和健壮性, 稳健的基础系统设置. 安装映像相对较小,可以根据非常具体的需求进行定制. 软件基础非常庞大,在撰写本文时共有56864个软件包. 不过,这里有一个警告. 这些软件包与桌面版本的Debian共享. 许多其他的发行版,包括客户端和服务器都是基于debian的 .deb packages.
  • Ubuntu Server is not bad either. 它完全建立在Debian之上,它与Debian 100%的二进制兼容, Canonical (Ubuntu背后的公司)正在加大投资,使Ubuntu成为可靠的服务器软件. 网上可以提供更多的帮助, 它有更多最新的软件包,这在服务器环境中是好坏参半的, 但它的LTS(长期支持)版本非常受欢迎. 使用Ubuntu和基于Ubuntu的桌面发行版的开发人员倾向于使用它,因为它使用了相同的软件包管理系统, apt.
  • RedHat Enterprise Linux 或简称RHEL,是由RedHat支持的另一个大型稳定服务器发行版. 它是一个商业发行版,提供免费的基础软件,但需要支付支持许可. 红帽公司有许多内部软件工具,它正在与几家最大的企业软件供应商合作, like Oracle, 让红帽成为企业系统的完美家园. 此外,它也是红帽平台即服务计划OpenShift的核心. RedHat Linux在企业开发人员中很流行, 因为对于较小的项目,支持许可证可能会有点贵. 软件包系统基于rpm软件包和yum更新管理器. 它在稳定性、寿命和软件支持方面与Debian和Ubuntu竞争.
  • CentOS 是RHEL的“免费”版本. 它几乎完全是用RHEL构建的, 剥离了红帽品牌,并基于相同的软件包系统和相同的软件包. 它在喜欢使用RPM和可能使用Fedora作为桌面系统的开发人员中很受欢迎.
  • Scientific LinuxLinux版本是由Fermilab发布的吗, CERN, 世界各地的其他实验室和大学已经准备好迎接实验者”. 它是一个更侧重于计算的发行版,适合于这样的目的, 它基于RedHat/CentOS.
  • CoreOS 作为运行软件容器的轻量级操作系统非常流行. 不像这里列出的其他发行版, CoreOS没有包管理器:开发者被期望提供所有的软件依赖,作为轻量级“容器”的一部分。, 一个自包含的软件包.

Contributors

Zlatko Duric

自由Linux开发人员

Germany

Zlatko是一名经验丰富的JavaScript开发人员,使用过Angular、React、Node.Js和其他技术. 凭借在web应用程序领域的经验, Zlatko专注于快速交付高质量的web项目. 拥有长期的工作经验和领导成功的网络项目,以及指导和培训, 兹拉特科试图保持技术的领先地位, 记住性能和可维护性的最佳实践.

Show More

Maksim Sipos

自由Linux开发人员

United Kingdom

Max的学术背景是数值计算物理(Ph.D.). 他曾在华尔街做定量分析师, 然后在金融和互联网公司担任数据科学家顾问. Max写全栈, production-level, high-performance, 为复杂的大数据或小数据问题提供分布式解决方案. 他是c++ (c++ 11)领域的资深程序员, Qt), Java, Python (NumPy, SciPy, Sklearn)和JavaScript (Node和前端).

Show More

从Toptal获取最新的开发人员更新.

订阅意味着同意我们的 privacy policy

推荐开发人员使用哪个桌面Linux发行版?

Among developers, 通常是需要设置Ruby或NodeJS或任何其他语言工作环境的后端开发人员, 经常会有一个很大的难题:应该使用哪个Linux发行版? 哪个Linux发行版是最好的? 哪个Linux发行版最容易安装? 哪个Linux发行版在虚拟环境或旧硬件上运行得最好? 所有这些问题都很难回答,整个系列的文章都可以写在这个主题上. 当开发人员没有时间和资源来测试所有不同的Linux发行版时,“选择最适合使用的”这个基本答案就不适用了. 更不用说推荐的Linux发行版了, 总有两个人意见不一致. But our best Linux开发人员总数 我为那些想要挑选最好的人准备了一个简短的名单,由最好的人推荐.

在这个列表之前,我们需要提到桌面环境. 在桌面Linux发行版中, 对于新用户来说,除了设置复杂性之外,主要的区别因素是桌面环境, like Gnome, Unity, Cinnamon, and KDE. 如果您认为推荐Linux发行版是一个主观且有争议的话题, 讨论最喜欢的Linux桌面环境就更难了, 因为它很容易引起激烈的争论,而且很难对其进行技术讨论. Nevertheless, 桌面环境通常在最终决策中扮演重要角色, 我们不得不提到它们, 但我们不会深入讨论细节. 看看包含的链接,了解他们的理念, 看看每一个是什么样子的, 然后挑一个你最喜欢的.

以下是未排名的榜单:

  • Ubuntu -大家一致认为,第一个也是最普遍的选择是Ubuntu. It is the easiest, 它支持大多数开箱即用的硬件, 它对刚接触Linux的人非常友好. 唯一的缺点是它很重,因为所有的东西都伴随着它. 同样值得注意的是,他们的Unity GUI在硬核Linux用户之间引起了很多争议.
  • Xubuntu -如果你在寻找简单,Xubuntu是你的选择. OS is lightweight, 它支持并在旧硬件上运行良好, 但请记住,有些东西并不是开箱即用的, 尤其是如果你有一台全新的超高清(UHD)显示器.
  • Kubuntu. 流行的基于Ubuntu的发行版,适合喜欢KDE桌面环境的人, 哪个环境有自己不同于其他环境的哲学.
  • elementaryOS 基于Ubuntu,深受OSX和Macintosh设计的影响. 如果您想要看起来像Macintosh的Linux,那么这就是您要选择的发行版. 它有自己的桌面“外壳”,有非常简约和轻量级的日常常用应用程序.
  • Mint - A bit heavy, 但没有Ubuntu那么受欢迎, 不错的肉桂桌面环境,适合喜欢经典桌面的人(肉桂基于Gnome 2).x). On the other hand, 它具有开箱即用的多媒体支持, 如果少了什么, 它兼容Ubuntu和Debian.
  • Fedora 来自RedHat的用户友好的发行版. 如果您喜欢Gnome 3的用户界面,建议使用它, 哪一个可以说是“最奇怪的”(这不是坏事, just unusual). 对于在服务器上运行RedHat Enterprise Linux或Centos的开发人员来说,Fedora也是一个不错的选择,因为它们共享相同的内核, and yum and rpm 来自RedHat Enterprise Linux和Centos的知识转移. Out of the box, Fedora Linux发行版一直被认为是一个很好的支持开发人员的发行版, 使用场景中可用的大量ide和开发构建工具.
  • Arch Linux 流行的“滚动发布”发行, 没有基础的“释放”, 但总是使用单个软件包的最新稳定版本. 希望始终处于领先地位的开发者应该研究一下这个发行版.

In the end, avoid Debian and RedHat特别是如果您是一个新的Linux用户. 它们更面向服务器端. 然而,尽管对开发人员来说不是很友好,但许多专业人士仍然在使用它们.

Contributors

罗格里奥·尼古拉斯·门格尔

自由Linux开发人员

Argentina

罗格里奥是个多面手, positive, 自我激励的全栈工程师,拥有超过12年的编程语言工作经验, frameworks, and platforms. 他喜欢接受新的挑战,并不断努力学习新的技能.

Show More

Zlatko Duric

自由Linux开发人员

Germany

Zlatko是一名经验丰富的JavaScript开发人员,使用过Angular、React、Node.Js和其他技术. 凭借在web应用程序领域的经验, Zlatko专注于快速交付高质量的web项目. 拥有长期的工作经验和领导成功的网络项目,以及指导和培训, 兹拉特科试图保持技术的领先地位, 记住性能和可维护性的最佳实践.

Show More

如何为命令行工作增加更多的问责制?

你不是机器. 至少大多数时候不是这样. 像任何人一样,你可能会被自己的不完美所愚弄,犯下我们所说的人为错误.

接下来的三个小建议将会帮助你在焦虑的时候获得内心的平静 not-so-sure 关于你的内疚, 或者只是让你知道,你需要承担自己的错误,并想办法弥补损失.

向bash历史记录添加时间戳

这个小提示将允许您查看您的shell历史, 知道每个命令的执行时间:

~$ export HISTTIMEFORMAT="%d/%m/%y %T "
~$ history
    [05/05/16] 18:07:03清楚
    2  05/05/16 18:07:04 cd
    [05/05/16] 18:07:05 ls -ltr
    [05/05/16] 18:07:07清楚
    [5/05/16] 18:07:12触摸文件
    chmod +rw文件
    chmod +x文件
    8  05/05/16 18:07:28 cat > file
    9 05/05/16 18:07:34 git commit -a -m ' cool feature'
   05/05/16 18:07:36 git push

如果您想将其永久保存,请将以下行添加到您的 .bashrc file.

export HISTTIMEFORMAT="%d/%m/%y %T "

跨多个会话共享您的即时bash历史记录

如今,几乎每个人都同时使用多个窗口或标签. 浏览器选项卡,聊天窗口,当然还有多个控制台会话. 你可能已经注意到了, 您的bash历史记录将在会话结束时注销到磁盘上. 这在大多数情况下是完全没问题的, 但是出于几个原因,您可能希望立即与其他会话共享该命令历史.

要做到这一点,你可以把这个加到你的 .bashrc file.

出口HISTCONTROL = ignoredups: erasedups  
shop -s -s - append  
export PROMPT_COMMAND="${PROMPT_COMMAND:+$PROMPT_COMMAND$'\n'}history -a; history -c; history -r"  

现在,让我解释一下它是如何工作的:

  • 第一个语句将避免命令历史记录中的重复条目.
  • 第二个语句将历史附加到历史文件中,而不是重写它.
  • 第三条语句将设置 PROMPT_COMMAND 变量,使用将保存文件的命令, 清除内存中的命令历史堆栈, 然后再次从磁盘重新加载文件. The PROMPT_COMMAND 每次在shell会话中执行命令时,都会执行变量内容, 或者直接按回车键, 然后在当前会话中更新历史堆栈.

检查命令修改了哪些文件

在使用命令行时,有一个总体的安全规则:如果您不知道它的作用, don’t run it. However, sometimes you want 执行特定的事情,甚至是在测试环境中执行代码,“看看会发生什么”.

那么,拿起这个神秘的命令,像这样运行它:

D="$(date "+%F %T.%N")"; sleep 0.5; ; find . -newermt "$D"  

Where 是你想要执行的吗.

本例使用当前时间并将其值保存到变量中 D,然后等待半秒并执行该命令. 最后,在当前目录中搜索从那时起创建的任何新文件. It’s not perfect, 因为另一个进程可能在此期间修改了文件, 但是它会给你一个很好的想法,让你知道哪些文件需要检查和查找更改.

这里有一些关于 sleep command. 除了事实 date 命令所花费的时间以纳秒为单位, 你的机器可能很快, 有些文件可能不会被 find. 检查假阳性结果总是比错过一些真实事件要好. 这一次,我假设您使用的是GNU sleep,目前支持1秒以下的分辨率. 否则,就使用 1 记住,通过延长时间来求值, 您可能会看到一些额外的假阳性结果.

现在,看看这个例子:

# D="$(日期)"+%F %T.%N")"; sleep 0.5; ./mysterious ; find /etc -newermt "$D";
别担心,我很好
/etc/passwd

The mysterious 命令,尽管它打印的是“别担心,我很好”,但修改了您的 /etc/passwd 文件,你只是通过这样执行它来找到它.

Contributors

Enrique Conci

自由Linux开发人员

Argentina

Enrique是一名高级Unix系统管理员,在Linux方面拥有丰富的经验, AIX, HP-UX and Solaris. 他专门研究任务自动化和大型应用程序的部署. 他在领导系统管理团队方面拥有超过5年的经验,并在基于unix的系统上工作了大约12年.

Show More

如何搜索和替换所有文件名中的字符串?

As a developer, 有时需要对目录下的一个或多个文件进行重命名, 并将文件名的一部分替换为特定字符串. 这可以在Linux shell中通过以下一行代码实现:

for file in *oldname*; do mv $file $(echo $file| sed -e "s/oldname/newname/g"); done

在上面的代码片段中, oldname 我们需要替换的搜索字符串是什么 newname 是新的替换字符串吗. The for 循环遍历当前目录中的所有文件并填充 file 使用找到的文件的每个实例. The sed 命令将找到的匹配字符串替换为新的替换字符串, 并将其作为第二个参数传递给 mv command. 注意,这个代码片段不会递归地进行字符串替换, 这意味着它不会进入子文件夹.

下面是一个重命名所有字符串文件的例子 oldname 并将其替换为 newname:

$ touch oldname.txt oldname.c oldname-test.c test-oldname.c
$ ls
oldname.c  oldname-test.c  oldname.txt  test-oldname.c
$ for file in *oldname*; do mv $file $(echo $file| sed -e "s/oldname/newname/g"); done
$ ls
newname.c  newname-test.c  newname.txt  test-newname.c

如果我们想做同样的事情, 但这次包括所有子文件夹中的文件(无论是否嵌套), 在Bash (version 4+)中这样做的一种方法是:

$ shop -s globstar
$ for file in ./**/*oldname*; do mv $file $(echo $file| sed -e "s/oldname/newname/g"); done

Enabling globstar 用双星符号, 我们要求shell递归地遍历文件夹树以找到所有匹配的文件. 代码片段的其余部分保持不变.

Contributors

John Kapolos

自由Linux开发人员

Greece

自21世纪初以来,约翰一直是自由职业者. 作为一名全能开发者,他一直在为美国/英国公司远程全职工作. 他擅长使用React和Ember进行SPA开发.js. 在后端,他喜欢使用Node和PHP. In his spare time, 他玩DevOps和维护他个人的分布式基础设施是为了好玩.

Show More

Yogindar Das Yasodhar

技术主管(思科系统)

在服务器管理领域的所有层面有15年的软件经验.

如何快速浏览Bash历史?

假设在一段时间以前,您使用了一个非常长的bash命令,现在您想重用它. 但是,您不希望滚动 up 通过反复点击箭头键到达它.

有一个简单的技巧可以用来访问Bash历史记录,它被称为 reverse-i-search mode. 此模式将按逆时间顺序搜索历史记录,因此包含输入关键字的最后使用的命令将首先出现.

为了快速浏览Bash历史,请按 CTRL+R 在键盘上激活bash的 reverse-i-search 模式,然后键入您要查找的命令的一部分,它就会显示出来. 当它出现时,按一下 Enter to execute it.

忍者提示:在搜索的时候, 尝试从您正在查找的前一个长命令中键入一个或多个唯一的单词, 因为这将帮助你更快地找到它.

Contributors

Khaled Monsoor

Sr. 软件工程师(R)&D) (Freelancer)

Python和JavaScript软件开发人员. 大数据爱好者. 摄影和咖啡爱好者.

如何分析日志文件以计算时间跨度内发生的次数?

Often, 分析日志文件时, 计算特定事件在一定时间范围内的发生次数是有用的. 例如,我们想要计算“新会话”的数量.

First, 让我们通过查找包含文本“New session”的最后两行来验证日志格式:

$ grep 'New session' test.log | tail -2
2016-06-30 15:50:56.985[033]信息会话50:新会话(总数50),来自“172”的呼叫.24.9.39".
2016-06-30 15:50:57.000[033]信息会话51:新会话(共51),来自“172”的呼叫.24.9.39".

在上面的命令中, grep 用于过滤所有日志行,并仅显示具有文本“New session”(区分大小写)的日志行。. Then, tail -2 用于仅显示由?筛选的最后两行 grep. The parameter -2 控件的通常默认值,确保只显示最后两行 tail 命令显示最后10行. The results of the grep 命令被重定向到 tail 使用管道的命令 |. 这使得所有的行被过滤掉 grep 作为输入到 tail command.

Now, 让我们使用上面提取的日志线来提出一种方法,对每小时发生的事件进行分组. 我们得到的所有日志线 grep 'New session' 将有以下格式:

2016-06-30 15:50:56.985[033]信息会话50:新会话(总数50),来自“172”的呼叫.24.9.39".

我们可以用的组合 cut and uniq 过滤的行中每小时发生的所有事件 grep. We’ll use cut 提取出 hour 从航海日志线经过 grep. 下面的比较显示了我们希望从每条日志行中得到哪些字符:

——字符索引------
0        10        20
1234567890123456789012345
----------------------------
2016-06-30 15:50:56.985[033]信息会话50:新会话(总数50),来自“172”的呼叫.24.9.39".
——上面的直线变成了——
15

因此,我们可以看到,我们只想从每条日志行提取第12和第13个字符, 因为它代表每个条目的小时. With this, 然后,我们可以对结果进行分组,并验证一天中每个小时的事件计数, 下一步我们要做什么.

要对每小时的事件进行分组和计数,我们使用 uniq -c. Please note the uniq 命令依赖于已排序的输入来正确分组, 也就是说不应该在第15个小时之后有第14个小时, for example. 对于日志来说,这很少是一个问题,因为时间应该总是随着添加新行而增加.

将这些命令组合在一起并执行,我们得到:

$ grep '新会话' aacserver20160630.Log | cut -c12-13 | uniq -c
  48 00
  42 01
  42 02
  66 03
   1 04
   2 05
   2 06
  42 07
  46 08
  44 09
  42 10
  42 11
  42 12
  42 13
  42 14
  42 15
   8 16

上面输出的每一行都包含两个数字. 第二个表示小时,第一个表示该小时的日志条目数(用于新会话). 因此,我们可以很快从这些结果中看出,在上午4点到7点之间可能出现了问题, 因为在这几个小时里,新会话的数量下降了很多.

这一切都很容易完成与结合 grep, cut and uniq commands.

Contributors

Guilherme Pim

支援工程师(G)&D)

Guilherme每天都要解决软件和系统可能出现的问题.

如何从命令输出中删除颜色代码?

Linux上的许多命令行工具生成彩色输出. For example, 在典型的Linux和Git设置中,下面的命令将产生输出行,每一行都以一个彩色单词开头:

$ git log - online -color
修复提交面板错误
d83ff21实现远端皮带
c0dfae9设置登录字段为必填项
8f69a2a初始提交

这些彩色输出, 当被人类阅读时, are convenient, however, 它们使得生成涉及管道和命令替换的复杂命令变得困难. 当在Git存储库中的终端中执行以下命令时, 它将生成存储库的第一个提交散列:

$ git log——oneline——color | tail -n 1 | awk '{print $1}'
8f69a2a

由于输出是彩色的,因此输出的实际内容包含一些隐藏字符. 下面的命令, 在Git存储库中执行时, 将以一个有点神秘的错误结束:

$ git show——pretty="format:"——name-only $(git log——oneline——color | tail -n 1 | awk '{print $1}')
bash: $'\E[33ma1d1e20\E[m':命令未找到
solver/solver.go

解决这个问题很简单,只需要对上面的命令做一个简单的修改. 用管道将彩色输出通过 sed这是一个Unix实用程序,用于解析和转换文本,以删除所有 不可见的颜色代码:

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g"
$ git show——pretty="format:"——name-only $(git log——online——color | \
		tail -n 1 | \
		Awk '{print $1}' | \
		sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g")
README.md
app.yaml
index.html
script.js
solver/solver.go
style.css

Contributors

克莱伯·维吉里奥·科雷亚

自由Linux开发人员

Brazil

Kleber是一名软件开发人员,在IT领域有十年的专业工作经验. 他喜欢在广泛的话题上分享和获取知识, including Unix, 敏捷软件开发, 函数式和面向对象语言, design patterns, RESTful架构, 分布式应用程序, 云计算.

Show More

Gilberto T. Garcia Jr

自由Linux开发人员

United States

Gilberto是一名软件工程师,具有范围界定方面的专业知识, architecting, developing, 维护web应用程序. 他的长处包括解决问题, 有效地沟通, 以及指导队友的能力. 他拥有卓越的技术知识,涵盖了所有技术, 包括服务器端, client side, and Q&A. 他还撰写了《欧博体育app下载》,该书于2013年由PacktPub出版.

Show More

如何避免忘记使用Sudo命令后的沮丧

您是否曾经在终端中键入命令,却发现忘记在其前面加上 sudo command? 您必须再次重新键入整个命令,以便添加 sudo in front of it. Frustrating!

你可以把这个简单的别名添加到 .bashrc 为了帮助你减少挫败感:

Alias argh='sudo $(history -p \!\!)'

这个命令非常简单; history 是否有一个程序可以跟踪您的终端命令历史. 中可以执行任何命令 history 通过使用各种方法描述在 man history page.

在我们的例子中,我们使用 history -p \!\!,它打印历史记录列表中最近的命令. So, our alias argh 使用命令执行历史中最后使用的命令 sudo in front of it.

当然,您可以更改字符串 argh 用你最喜欢的词. Here is an 这个想法的例子和原始来源.

Contributors

Luqman Sungkar

联合创始人(Fliptech Lentera Inspirasi Pertiwi)

卢克曼是flip的联合创始人.id,印度尼西亚的一家创业公司. 他负责建立和维护创业公司背后的所有IT系统.

Submit a tip

提交的问题和答案将被审查和编辑, 并可能会或可能不会选择张贴, 由Toptal全权决定, LLC.

*所有字段均为必填项

Toptal连接 Top 3% 世界各地的自由职业人才.

加入Toptal社区.