我们运行一个Apache Cassandra集群,其中每个主机在任何给定时间都有几十万个文件打开。
我们希望能够定期获取打开文件的数量并将这个数字输入到Graphite 中,但是当我们在 Graphitelsof下运行时collectd,它最终需要几分钟才能完成并同时消耗过多的 CPU .
我想知道是否有另一种更友好的方式来获取 lsof 提供的相同数据,或者甚至是一种运行 lsof 的方法,它不会明显地占用 CPU?(虽然我认为后一种方法可能需要比目前更长的时间才能完成......并不理想)。
也许内核在某处维护了一些包含打开文件数的变量?妄想?
更新:
作为对其中一个答案的回应,我们已经在使用-b和-n标志。这是我在下面运行的完整命令collectd:
sudo lsof -b -n -w | stdbuf -i0 -o0 -e0 wc -l
Run Code Online (Sandbox Code Playgroud) 我们有几个应用程序正在生成自己的纯文本日志文件,我想将其转发到远程 syslog 服务器以进行集中日志记录。我无权访问root这些机器,也无法重新配置syslog以将输出重定向到远程机器。
我在网上找到了一些解决方案,但它们大多是人们自制的 bash 脚本,我正在寻找适合在潜在大批量生产环境中实施的更强大的东西。
最好是设计的东西,着眼于占用空间小,后台守护进程不断运行,可以跟上很多行等。 - 目前有哪些解决方案?
有趣的小困境。这是 Centos。昨晚我在 tty 上登录了物理控制台。我启动了一个命令,让它在一夜之间运行。tty 仍然登录,但我目前通过 ssh 远程登录(我不在控制台。)
我想知道我使用的确切命令参数(我不记得了),所以我想看看我在那个 tty 上运行的命令。由于 shell 仍在运行,它没有向 bash_history 写入任何内容 - 该实例的历史记录仍在内存中。
所以,我的问题是是否有办法远程检索我想要的东西,也许:
(a) 向正在运行的 shell 发送信号,使其转储其 bash 历史记录 (b) 检查正在运行的 shell 的环境以获取其历史信息 (c) 检查来自 tty 会话的最新 x # 行,以便我可以看到我输入的内容
或其他方式....
根据手册页,右侧的字符串=~被视为扩展正则表达式。我尝试了以下方法来匹配两边被空格包围的“ok”,但没有任何效果。知道我做错了什么吗?也许有一个需要启用的shell选项?
if ! [[ $RESULT =~ \s"ok"\s ]]; then
if ! [[ $RESULT =~ [:space:]"ok"[:space:] ]]; then
if ! [[ $RESULT =~ [ \t\r\n\v\f]"ok"[ \t\r\n\v\f] ]]; then
Run Code Online (Sandbox Code Playgroud)
注意:下面的自我回答问题。
我们都知道 Linux/Unix 会自动阻止对当前打开的另一个进程写入的文件的尝试。但是,如果另一个进程打开文件进行写入,是否可以阻止/锁定对文件的读取访问?我有两个不同的脚本,两者都在随机时间启动并在一天中运行不同时间:一个脚本覆盖特定文件;另一个脚本覆盖特定文件。另一个从该文件中读取。如果第一个打开了文件,我希望第二个阻塞(等待)或失败。
运行 aws ec2 describe-instances 将返回类似于以下内容的 json 文本:
{
"Reservations": [
{
"Instances": [
"PublicDnsName": "ec2..."
"VpcId": "vpc-...",
...
"Instances": [
Run Code Online (Sandbox Code Playgroud)
我知道对于每个“实例”我可以提取单个字段的内容,例如 PublicDnsName,使用 jq 如下:
jq '.Reservations[].Instances[].PublicDnsName'它将列出我实例的 dns 名称但是我如何提取两个或多个字段并用空格分隔它们或逗号什么的?我希望为每个实例并排列出 PublicDnsName 和 VpcId。
具体来说,我正在寻找的是 VpcId 为空、未定义或不存在的实例列表。换句话说,我想要一个我的经典实例列表,我需要通过 api 来处理结果。