2021年4月

现在,远程协作已作为一项必不可少的能力,让开源实时聊天成为你工具箱中必不可少的一部分吧。

 title=

清晨起床后,我们通常要做的第一件事是检查手机,看看是否有同事和朋友发来的重要信息。无论这是否是一个好习惯,但这种行为早已成为我们日常生活的一部分。

人是理性动物。他可以为任何他想相信的事情想出一个理由。 – 阿纳托尔·法朗士

无论理由是否合理,我们每天都在使用的一系列的通讯工具,例如电子邮件、电话、网络会议工具或社交网络。甚至在 COVID-19 之前,居家办公就已经使这些通信工具成为我们生活中的重要部分。随着疫情出现,居家办公成为新常态,我们交流方式的方方面面正面临着前所未有的改变,这让这些工具变得不可或缺。

为什么需要聊天?

作为全球团队的一部分进行远程工作时,我们必须要有一个相互协作的环境。聊天应用软件在帮助我们保持相互联系中起着至关重要的作用。与电子邮件相比,聊天应用软件可提供与全球各地的同事快速、实时的通信。

选择一款聊天应用软件需要考虑很多因素。为了帮助你选择最适合你的应用软件,在本文中,我将探讨四款开源聊天应用软件,和一个当你需要与同事“面对面”时的开源视频通信工具,然后概述在高效的通讯应用软件中,你应当考虑的一些功能。

四款开源聊天软件

Rocket.Chat

 title=

Rocket.Chat 是一个综合性的通讯平台,其将频道分为公开房间(任何人都可以加入)和私有房间(仅受邀请)。你还可以直接将消息发送给已登录的人员。其能共享文档、链接、照片、视频和 动态图 GIF ,以及进行视频通话,并可以在平台中发送语音信息。

Rocket.Chat 是自由开源软件,但是其独特之处在于其可自托管的聊天系统。你可以将其下载到你的服务器上,无论它是本地服务器或是在公有云上的虚拟专用服务器。

Rocket.Chat 是完全免费,其 源码 可在 Github 获得。许多开源项目都使用 Rocket.Chat 作为他们官方交流平台。该软件在持续不断的发展且不断更新和改进新功能。

我最喜欢 Rocket.Chat 的地方是其能够根据用户需求来进行自定义操作,并且它使用机器学习在用户通讯间进行自动的、实时消息翻译。你也可以下载适用于你移动设备的 Rocket.Chat,以便能随时随地使用。

IRC

 title=

IRC( 互联网中继聊天 Internet Relay Chat )是一款实时、基于文本格式的通信软件。尽管其是最古老的电子通讯形式之一,但在许多知名的软件项目中仍受欢迎。

IRC 频道是单独的聊天室。它可以让你在一个开放的频道中与多人进行聊天或与某人私下一对一聊天。如果频道名称以 # 开头,则可以假定它是官方的聊天室,而以 ## 开头的聊天室通常是非官方的聊天室。

上手 IRC 很容易。你的 IRC 昵称可以让人们找到你,因此它必须是唯一的。但是,你可以完全自主地选择 IRC 客户端。如果你需要比标准 IRC 客户端更多功能的应用程序,则可以使用 Riot.im 连接到 IRC。

考虑到它悠久的历史,你为什么还要继续使用 IRC?出于一个原因是,其仍是我们所依赖的许多自由及开源项目的家园。如果你想参于开源软件开发和社区,可以选择用 IRC。

Zulip

 title=

Zulip 是十分流行的群聊应用程序,它遵循基于话题线索的模式。在 Zulip 中,你可以订阅 stream ,就像在 IRC 频道或 Rocket.Chat 中一样。但是,每个 Zulip 流都会拥有一个唯一的 话题 topic ,该话题可帮助你以后查找对话,因此其更有条理。

与其他平台一样,它支持表情符号、内嵌图片、视频和推特预览。它还支持 LaTeX 来分享数学公式或方程式、支持 Markdown 和语法高亮来分享代码。

Zulip 是跨平台的,并提供 API 用于编写你自己的程序。我特别喜欢 Zulip 的一点是它与 GitHub 的集成整合功能:如果我正在处理某个 议题 issue ,则可以使用 Zulip 的标记回链某个 拉取请求 pull request ID。

Zulip 是开源的(你可以在 GitHub 上访问其 源码)并且免费使用,但它有提供预置支持、LDAP 集成和更多存储类型的付费产品。

Let's Chat

 title=

Let's Chat 是一个面向小型团队的自托管的聊天解决方案。它使用 Node.js 和 MongoDB 编写运行,只需鼠标点击几下即可将其部署到本地服务器或云服务器。它是自由开源软件,可以在 GitHub 上查看其 源码

Let's Chat 与其他开源聊天工具的不同之处在于其企业功能:它支持 LDAP 和 Kerberos) 身份验证。它还具有新用户想要的所有功能:你可以在历史记录中搜索过往消息,并使用 @username 之类的标签来标记人员。

我喜欢 Let's Chat 的地方是它拥有私人的受密码保护的聊天室、发送图片、支持 GIPHY 和代码粘贴。它不断更新,不断增加新功能。

附加:开源视频聊天软件 Jitsi

 title=

有时,文字聊天还不够,你还可能需要与某人面谈。在这种情况下,如果不能选择面对面开会交流,那么视频聊天是最好的选择。Jitsi 是一个完全开源的、支持多平台且兼容 WebRTC 的视频会议工具。

Jitsi 从 Jitsi Desktop 开始,已经发展成为许多 项目,包括 Jitsi Meet、Jitsi Videobridge、jibri 和 libjitsi,并且每个项目都在 GitHub 上开放了 源码

Jitsi 是安全且可扩展的,并支持诸如 联播 simulcast 带宽预估 bandwidth estimation 之类的高级视频路由的概念,还包括音频、录制、屏幕共享和拨入功能等经典功能。你可以来为你的视频聊天室设置密码以保护其不受干扰,并且它还支持通过 YouTube 进行直播。你还可以搭建自己的 Jitsi 服务器,并将其托管在本地或 虚拟专用服务器 virtual private server (例如 Digital Ocean Droplet)上。

我最喜欢 Jitsi 的是它是免费且低门槛的。任何人都可以通过访问 meet.jit.si 来立即召开会议,并且用户无需注册或安装即可轻松参加会议。(但是,注册的话能拥有日程安排功能。)这种入门级低门槛的视频会议服务让 Jitsi 迅速普及。

选择一个聊天应用软件的建议

各种各样的开源聊天应用软件可能让你很难抉择。以下是一些选择一款聊天应用软件的一般准则。

  • 最好具有交互式的界面和简单的导航工具。
  • 最好寻找一种功能强大且能让人们以各种方式使用它的工具。
  • 如果与你所使用的工具有进行集成整合的话,可以重点考虑。一些工具与 GitHub 或 GitLab 以及某些应用程序具有良好的无缝衔接,这将是一个非常有用的功能。
  • 有能托管到云主机的工具将十分方便。
  • 应考虑到聊天服务的安全性。在私人服务器上托管服务的能力对许多组织和个人来说是必要的。
  • 最好选择那些具有丰富的隐私设置,并拥有私人聊天室和公共聊天室的通讯工具。

由于人们比以往任何时候都更加依赖在线服务,因此拥有备用的通讯平台是明智之举。例如,如果一个项目正在使用 Rocket.Chat,则必要之时,它还应具有跳转到 IRC 的能力。由于这些软件在不断更新,你可能会发现自己已经连接到多个渠道,因此集成整合其他应用将变得非常有价值。

在各种可用的开源聊天服务中,你喜欢和使用哪些?这些工具又是如何帮助你进行远程办公?请在评论中分享你的想法。


via: https://opensource.com/article/20/4/open-source-chat

作者:Sudeshna Sur 选题:lujun9972 译者:wyxplus 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

与其手动执行重复性的任务,不如让 Linux 为你做。

 title=

在 2021 年,人们有更多的理由喜欢 Linux。在这个系列中,我将分享使用 Linux 的 21 个不同理由。自动化是使用 Linux 的最佳理由之一。

我最喜欢 Linux 的一个原因是它愿意为我做工作。我不想执行重复性的任务,这些任务会占用我的时间,或者容易出错,或者我可能会忘记,我安排 Linux 为我做这些工作。

为自动化做准备

“自动化”这个词既让人望而生畏,又让人心动。我发现用模块化的方式来处理它是有帮助的。

1、你想实现什么?

首先,要知道你想产生什么结果。你是要给图片加水印吗?从杂乱的目录中删除文件?执行重要数据的备份?为自己明确定义任务,这样你就知道自己的目标是什么。如果有什么任务是你发现自己每天都在做的,甚至一天一次以上,那么它可能是自动化的候选者。

2、学习你需要的应用

将大的任务分解成小的组件,并学习如何手动但以可重复和可预测的方式产生每个结果。在 Linux 上可以做的很多事情都可以用脚本来完成,但重要的是要认识到你当前的局限性。学习如何自动调整几张图片的大小,以便可以方便地通过电子邮件发送,与使用机器学习为你的每周通讯生成精心制作的艺术品之间有天壤之别。有的事你可以在一个下午学会,而另一件事可能要花上几年时间。然而,我们都必须从某个地方开始,所以只要从小做起,并时刻注意改进的方法。

3、自动化

在 Linux 上使用一个自动化工具来定期实现它。这就是本文介绍的步骤!

要想自动化一些东西,你需要一个脚本来自动化一个任务。在测试时,最好保持简单,所以本文自动化的任务是在 /tmp 目录下创建一个名为 hello 的文件。

#!/bin/sh

touch /tmp/hello

将这个简单的脚本复制并粘贴到一个文本文件中,并将其命名为 example

Cron

每个安装好的 Linux 系统都会有的内置自动化解决方案就是 cron 系统。Linux 用户往往把 cron 笼统地称为你用来安排任务的方法(通常称为 “cron 作业”),但有多个应用程序可以提供 cron 的功能。最通用的是 cronie;它的优点是,它不会像历史上为系统管理员设计的 cron 应用程序那样,假设你的计算机总是开着。

验证你的 Linux 发行版提供的是哪个 cron 系统。如果不是 cronie,你可以从发行版的软件仓库中安装 cronie。如果你的发行版没有 cronie 的软件包,你可以使用旧的 anacron 软件包来代替。anacron 命令是包含在 cronie 中的,所以不管你是如何获得它的,你都要确保在你的系统上有 anacron 命令,然后再继续。anacron 可能需要管理员 root 权限,这取决于你的设置。

$ which anacron
/usr/sbin/anacron

anacron 的工作是确保你的自动化作业定期执行。为了做到这一点,anacron 会检查找出最后一次运行作业的时间,然后检查你告诉它运行作业的频率。

假设你将 anacron 设置为每五天运行一次脚本。每次你打开电脑或从睡眠中唤醒电脑时,anacron都会扫描其日志以确定是否需要运行作业。如果一个作业在五天或更久之前运行,那么 anacron 就会运行该作业。

Cron 作业

许多 Linux 系统都捆绑了一些维护工作,让 cron 来执行。我喜欢把我的工作与系统工作分开,所以我在我的主目录中创建了一个目录。具体来说,有一个叫做 ~/.local 的隐藏文件夹(“local” 的意思是它是为你的用户账户定制的,而不是为你的“全局”计算机系统定制的),所以我创建了子目录 etc/cron.daily 来作为 cron 在我的系统上的家目录。你还必须创建一个 spool 目录来跟踪上次运行作业的时间。

$ mkdir -p ~/.local/etc/cron.daily ~/.var/spool/anacron

你可以把任何你想定期运行的脚本放到 ~/.local/etc/cron.daily 目录中。现在把 example 脚本复制到目录中,然后 用 chmod 命令使其可执行

$ cp example ~/.local/etc/cron.daily
# chmod +x ~/.local/etc/cron.daily/example

接下来,设置 anacron 来运行位于 ~/.local/etc/cron.daily 目录下的任何脚本。

anacron

默认情况下,cron 系统的大部分内容都被认为是系统管理员的领域,因为它通常用于重要的底层任务,如轮换日志文件和更新证书。本文演示的配置是为普通用户设置个人自动化任务而设计的。

要配置 anacron 来运行你的 cron 作业,请在 /.local/etc/anacrontab 创建一个配置文件:

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
1  0  cron.mine    run-parts /home/tux/.local/etc/cron.daily/

这个文件告诉 anacron 每到新的一天(也就是每日),延迟 0 分钟后,就运行(run-parts)所有在 ~/.local/etc/cron.daily 中找到的可执行脚本。有时,会使用几分钟的延迟,这样你的计算机就不会在你登录后就被所有可能的任务冲击。不过这个设置适合测试。

cron.mine 值是进程的一个任意名称。我称它为 cron.mine,但你也可以称它为 cron.personalpenguin 或任何你想要的名字。

验证你的 anacrontab 文件的语法:

$ anacron -T -t ~/.local/etc/anacrontab \
  -S /home/tux/.var/spool/anacron

沉默意味着成功。

在 .profile 中添加 anacron

最后,你必须确保 anacron 以你的本地配置运行。因为你是以普通用户而不是 root 用户的身份运行 anacron,所以你必须将它引导到你的本地配置:告诉 anacron 要做什么的 anacrontab 文件,以及帮助 anacron 跟踪每一个作业最后一次执行是多少天的 spool 目录:

anacron -fn -t /home/tux/.local/etc/anacrontab \
  -S /home/tux/.var/spool/anacron

-fn 选项告诉 anacron 忽略 时间戳,这意味着你强迫它无论如何都要运行你的 cron 作业。这完全是为了测试的目的。

测试你的 cron 作业

现在一切都设置好了,你可以测试作业了。从技术上讲,你可以在不重启的情况下进行测试,但重启是最有意义的,因为这就是设计用来处理中断和不规则的登录会话的。花点时间重启电脑、登录,然后寻找测试文件:

$ ls /tmp/hello
/tmp/hello

假设文件存在,那么你的示例脚本已经成功执行。现在你可以从 ~/.profile 中删除测试选项,留下这个作为你的最终配置。

anacron -t /home/tux/.local/etc/anacrontab \
  -S /home/tux/.var/spool/anacron

使用 anacron

你已经配置好了你的个人自动化基础设施,所以你可以把任何你想让你的计算机替你管理的脚本放到 ~/.local/etc/cron.daily 目录下,它就会按计划运行。

这取决于你希望作业运行的频率。示例脚本是每天执行一次。很明显,这取决于你的计算机在任何一天是否开机和醒着。如果你在周五使用电脑,但把它设置在周末,脚本就不会在周六和周日运行。然而,在周一,脚本会执行,因为 anacron 会知道至少有一天已经过去了。你可以在 ~/.local/etc 中添加每周、每两周、甚至每月的目录,以安排各种各样的间隔。

要添加一个新的时间间隔:

  1. ~/.local/etc 中添加一个目录(例如 cron.weekly)。
  2. ~/.local/etc/anacrontab 中添加一行,以便在新目录下运行脚本。对于每周一次的间隔,其配置如下。7 0 cron.mine run-parts /home/tux/.local/etc/cron.weekly/0 的值可以选择一些分钟数,以适当地延迟脚本的启动)。
  3. 把你的脚本放在 cron.weekly 目录下。

欢迎来到自动化的生活方式。它不会让人感觉到,但你将会变得更有效率。


via: https://opensource.com/article/21/2/linux-automation

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

研究人员教会机器人如何逃离熊孩子殴打

在日本的一家商场里,一帮没有人监管的熊孩子反复对机器人拳打脚踢、摇晃……

日本一个研究小组开发了一个计算机模拟和统计模型,显示熊孩子们对机器人的虐待主要发生在他们成群结队且附近没有成年人的时候。他们设计了一种躲避虐待的算法,帮助机器人避免这些熊孩子可能结伙攻击它的情况。机器人会计算出被虐待的概率。如果机器人在统计上处于危险之中,它就会改变路线,走向更拥挤的区域或更高的人。

根据阿西莫夫三定律,机器人不能伤害人类,而随着各种智能机器人出现在我们的身边,我们是时候教会机器人如何保护自己了。

Node.js 的竞争对手 Deno 成立商业公司

Deno 的创建者们已经成立了 Deno 公司,这是一家围绕 JavaScript/TypeScript 运行时的商业企业,也是 Node.js 的竞争对手。他们表示,虽然他们计划追求 Deno 的商业应用,但 Deno 本身仍将保持 MIT 授权。Deno 的创始人们认为,服务器端 JavaScript 被委员会统治,没有创新的动力,停滞不前。他们希望能够为不同的应用程序创建自定义运行时环境。

我认为,Deno 的出现和商业化,会有力的推动 JavaScript 的发展。

微软的 Linux 版 Edge 浏览器现在支持跨设备同步功能

微软最近在开发通道发布的 Linux 版 Edge 浏览器,可以让 Linux 用户在设备之间同步他们的书签、扩展、设置和历史记录。

微软决定放弃支持自己的 Edge 浏览器引擎,而选择开源的 Chromium 浏览器引擎,至少在支持 Linux 上,有着先天的优势,因为 Chromium 浏览器引擎已经在 Linux 上证明了自己。

了解 Lua 如何处理数据的读写。

 title=

有些数据是临时的,存储在 RAM 中,只有在应用运行时才有意义。但有些数据是要持久的,存储在硬盘上供以后使用。当你编程时,无论是简单的脚本还是复杂的工具套件,通常都需要读取和写入文件。有时文件可能包含配置选项,而另一些时候这个文件是你的用户用你的应用创建的数据。每种语言都会以不同的方式处理这项任务,本文将演示如何使用 Lua 处理文件数据。

安装 Lua

如果你使用的是 Linux,你可以从你的发行版软件库中安装 Lua。在 macOS 上,你可以从 MacPortsHomebrew 安装 Lua。在 Windows 上,你可以从 Chocolatey 安装 Lua。

安装 Lua 后,打开你最喜欢的文本编辑器并准备开始。

用 Lua 读取文件

Lua 使用 io 库进行数据输入和输出。下面的例子创建了一个名为 ingest 的函数来从文件中读取数据,然后用 :read 函数进行解析。在 Lua 中打开一个文件时,有几种模式可以启用。因为我只需要从这个文件中读取数据,所以我使用 r(代表“读”)模式:

function ingest(file)
   local f = io.open(file, "r")
   local lines = f:read("*all")
   f:close()
   return(lines)
end

myfile=ingest("example.txt")
print(myfile)

在这段代码中,注意到变量 myfile 是为了触发 ingest 函数而创建的,因此,它接收该函数返回的任何内容。ingest 函数返回文件的行数(从一个称为 lines 的变量中0。当最后一步打印 myfile 变量的内容时,文件的行数就会出现在终端中。

如果文件 example.txt 中包含了配置选项,那么我会写一些额外的代码来解析这些数据,可能会使用另一个 Lua 库,这取决于配置是以 INI 文件还是 YAML 文件或其他格式存储。如果数据是 SVG 图形,我会写额外的代码来解析 XML,可能会使用 Lua 的 SVG 库。换句话说,你的代码读取的数据一旦加载到内存中,就可以进行操作,但是它们都需要加载 io 库。

用 Lua 将数据写入文件

无论你是要存储用户用你的应用创建的数据,还是仅仅是关于用户在应用中做了什么的元数据(例如,游戏保存或最近播放的歌曲),都有很多很好的理由来存储数据供以后使用。在 Lua 中,这是通过 io 库实现的,打开一个文件,将数据写入其中,然后关闭文件:

function exgest(file)
   local f = io.open(file, "a")
   io.output(f)
   io.write("hello world\n")
   io.close(f)
end

exgest("example.txt")

为了从文件中读取数据,我以 r 模式打开文件,但这次我使用 a (用于”追加“)将数据写到文件的末尾。因为我是将纯文本写入文件,所以我添加了自己的换行符(/n)。通常情况下,你并不是将原始文本写入文件,你可能会使用一个额外的库来代替写入一个特定的格式。例如,你可能会使用 INI 或 YAML 库来帮助编写配置文件,使用 XML 库来编写 XML,等等。

文件模式

在 Lua 中打开文件时,有一些保护措施和参数来定义如何处理文件。默认值是 r,允许你只读数据:

  • r 只读
  • w 如果文件不存在,覆盖或创建一个新文件。
  • r+ 读取和覆盖。
  • a 追加数据到文件中,或在文件不存在的情况下创建一个新文件。
  • a+ 读取数据,将数据追加到文件中,或文件不存在的话,创建一个新文件。

还有一些其他的(例如,b 代表二进制格式),但这些是最常见的。关于完整的文档,请参考 Lua.org/manual 上的优秀 Lua 文档。

Lua 和文件

和其他编程语言一样,Lua 有大量的库支持来访问文件系统来读写数据。因为 Lua 有一个一致且简单语法,所以很容易对任何格式的文件数据进行复杂的处理。试着在你的下一个软件项目中使用 Lua,或者作为 C 或 C++ 项目的 API。


via: https://opensource.com/article/21/3/lua-files

作者:Seth Kenlon 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

昨天我 在 Twitter 上询问大家用 strace 解决了什么问题?,和往常一样,大家真的是给出了自己的答案! 我收到了大约 200 个答案,然后花了很多时间手动将它们归为 9 类。

这些解决的问题都是关于寻找程序依赖的文件、找出程序卡住或慢的原因、或者找出程序失败的原因。这些总体上与我自己使用 strace 的内容相吻合,但也有一些我没有想到的东西!

我不打算在这篇文章里解释什么是 strace,但我有一本 关于它的免费杂志一个讲座 以及 很多博文

问题 1:配置文件在哪里?

最受欢迎的问题是“这个程序有一个配置文件,但我不知道它在哪里”。这可能也是我最常使用 strace 解决的问题,因为这是个很简单的问题。

这很好,因为一个程序有一百万种方法来记录它的配置文件在哪里(在手册页、网站上、--help等),但只有一种方法可以让它真正打开它(用系统调用!)。

问题 2:这个程序还依赖什么文件?

你也可以使用 strace 来查找程序依赖的其他类型的文件,比如:

问题 3:为什么这个程序会挂掉?

你有一个程序,它只是坐在那里什么都不做,这是怎么回事?这个问题特别容易回答,因为很多时候你只需要运行 strace -p PID,看看当前运行的是什么系统调用。你甚至不需要看几百行的输出。

答案通常是“正在等待某种 I/O”。“为什么会卡住”的一些可能的答案(虽然还有很多!):

  • 它一直在轮询 select()
  • 正在 wait() 等待一个子进程完成
  • 它在向某个没有响应的东西发出网络请求
  • 正在进行 write(),但由于缓冲区已满而被阻止。
  • 它在 stdin 上做 read(),等待输入。

有人还举了一个很好的例子,用 strace 调试一个卡住的 df 命令:“用 strace df -h 你可以找到卡住的挂载,然后卸载它”。

问题 4:这个程序卡住了吗?

这是上一个问题的变种:有时一个程序运行的时间比你预期的要长,你只是想知道它是否卡住了,或者它是否还在继续进行。

只要程序在运行过程中进行系统调用,用 strace 就可以超简单地回答这个问题:只需 strace 它,看看它是否在进行新的系统调用!

问题 5:为什么这个程序很慢?

你可以使用 strace 作为一种粗略的剖析工具:strace -t 会显示每次系统调用的时间戳,这样你就可以寻找大的漏洞,找到罪魁祸首。

以下是 Twitter 上 9 个人使用 strace 调试“为什么这个程序很慢?”的小故事。

  • 早在 2000 年,我帮助支持的一个基于 Java 的网站在适度的负载下奄奄一息:页面加载缓慢,甚至完全加载不出来。我们对 J2EE 应用服务器进行了测试,发现它每次只读取一个类文件。开发人员没有使用 BufferedReader,这是典型的 Java 错误。
  • 优化应用程序的启动时间……运行 strace 可以让人大开眼界,因为有大量不必要的文件系统交互在进行(例如,在同一个配置文件上反复打开/读取/关闭;在一个缓慢的 NFS 挂载上加载大量的字体文件,等等)。
  • 问自己为什么在 PHP 中从会话文件中读取(通常是小于 100 字节)非常慢。结果发现一些 flock 系统调用花了大约 60 秒。
  • 一个程序表现得异常缓慢。使用 strace 找出它在每次请求时,通过从 /dev/random 读取数据并耗尽熵来重新初始化其内部伪随机数发生器。
  • 我记得最近一件事是连接到一个任务处理程序,看到它有多少网络调用(这是意想不到的)。
  • strace 显示它打开/读取同一个配置文件数千次。
  • 服务器随机使用 100% 的 CPU 时间,实际流量很低。原来是碰到打开文件数限制,接受一个套接字时,得到 EMFILE 错误而没有报告,然后一直重试。
  • 一个工作流运行超慢,但是没有日志,结果它做一个 POST 请求花了 30 秒而超时,然后重试了 5 次……结果后台服务不堪重负,但是也没有可视性。
  • 使用 strace 注意到 gethostbyname() 需要很长时间才能返回(你不能直接看到 gethostbyname,但你可以看到 strace 中的 DNS 数据包)

问题 6:隐藏的权限错误

有时候程序因为一个神秘的原因而失败,但问题只是有一些它没有权限打开的文件。在理想的世界里,程序会报告这些错误(“Error opening file /dev/whatever: permission denied”),当然这个世界并不完美,所以 strace 真的可以帮助解决这个问题!

这其实是我最近使用 strace 做的事情。我使用了一台 AxiDraw 绘图仪,当我试图启动它时,它打印出了一个难以理解的错误信息。我 strace 它,结果发现我的用户没有权限打开 USB 设备。

问题 7:正在使用什么命令行参数?

有时候,一个脚本正在运行另一个程序,你想知道它传递的是什么命令行标志!

几个来自 Twitter 的例子。

  • 找出实际上是用来编译代码的编译器标志
  • 由于命令行太长,命令失败了

问题 8:为什么这个网络连接失败?

基本上,这里的目标是找到网络连接的域名 / IP 地址。你可以通过 DNS 请求来查找域名,或者通过 connect 系统调用来查找 IP。

一般来说,当 tcpdump 因为某些原因不能使用或者只是因为比较熟悉 strace 时,就经常会使用 strace 调试网络问题。

问题 9:为什么这个程序以一种方式运行时成功,以另一种方式运行时失败?

例如:

  • 同样的二进制程序在一台机器上可以运行,在另一台机器上却失败了
  • 可以运行,但被 systemd 单元文件生成时失败
  • 可以运行,但以 su - user /some/script 的方式运行时失败
  • 可以运行,作为 cron 作业运行时失败

能够比较两种情况下的 strace 输出是非常有用的。虽然我在调试“以我的用户身份工作,而在同一台计算机上以不同方式运行时却失败了”时,第一步是“看看我的环境变量”。

我在做什么:慢慢地建立一些挑战

我之所以会想到这个问题,是因为我一直在慢慢地进行一些挑战,以帮助人们练习使用 strace 和其他命令行工具。我的想法是,给你一个问题,一个终端,你可以自由地以任何方式解决它。

所以我的目标是用它来建立一些你可以用 strace 解决的练习题,这些练习题反映了人们在现实生活中实际使用它解决的问题。

就是这样!

可能还有更多的问题可以用 strace 解决,我在这里还没有讲到,我很乐意听到我错过了什么!

我真的很喜欢看到很多相同的用法一次又一次地出现:至少有 20 个不同的人回答说他们使用 strace 来查找配置文件。而且和以往一样,我觉得这样一个简单的工具(“跟踪系统调用!”)可以用来解决这么多不同类型的问题,真的很令人高兴。


via: https://jvns.ca/blog/2021/04/03/what-problems-do-people-solve-with-strace/

作者:Julia Evans 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

苹果应用商店上的假应用导致用户被骗取 17.1 个比特币

一位使用 “Trezor” 硬件钱包存储他的比特币的用户,他在 iPhone 的应用商店里搜索 “Trezor” 下载安装的应用导致他的比特币瞬间被窃取。在应用商店中,他下载的该应用显示了挂锁标志,以及接近五星的应用评分。他下载了它,并输入了他的凭证,不到一秒钟,他价值 60 万美元的 17.1 个比特币就被窃取了。这款应用是个假的应用,旨在欺骗人们,让他们以为这是一款合法的应用。

苹果宣称其应用商店是“世界上最值得信赖的应用市场”。当苹果发现钓鱼应用后,就会删除这些应用,并禁止使用。但对于那些上当受骗的人来说,为时已晚。

CentOS Linux 克隆版 AlmaLinux 正式发布

正如我们所知道的,CentOS Linux 成为了 CentOS Stream 之后,一夜之间,社区涌现了一大批以弥补 CentOS Linux 市场空缺为己任的 Linux 发行版。其中 CentOS 服务商 CloudLinux 宣布的 AlmaLinux 得到了较多关注。

AlmaLinux 刚刚发布了第一个新版本。CloudLinux 成立了一个非盈利组织 AlmaLinux 开源基金会以管理该项目,并且承诺每年捐赠 100 万美元来支持该项目。

很多 CentOS 用户都期待一个可以依赖的 CentOS 替代品,不知道 AlmaLinux 抑或其它替代品是否能取得人们的信任。

恶意行为者滥用 GitHub Actions 功能进行加密挖矿活动

这些攻击自 2020 年秋季以来一直在进行,其滥用了 GitHub 的一个名为 GitHub Actions 的功能。攻击专门针对那些拥有自动化工作流程的 GitHub 项目,将恶意的 GitHub Actions 添加到原始代码中,然后向原始仓库提交拉取请求,以便触发 GitHub Actions。攻击并不依赖于原始项目所有者是否批准该拉取请求,只要提交拉取请求就足以实现攻击。

攻击者仅通过一次攻击就可以产生上百个虚拟加密矿机,从而对 GitHub 的基础设施造成了巨大的计算负荷。GitHub 表示他们正在积极调查。但似乎从去年以来并没有什么改善。

真是可恶啊,GitHub 免费提供的 Actions 也能被滥用!