我花了几天时间编写了一个 python 脚本,并为它创建了一个 systemd 单元文件。在测试期间,该脚本将大量错误记录到 journald。现在我已经完成了,我想从日记中清除这些错误。
有多种方法可以清除整个日志,如下所述:如何清除 journalctl
包括使用journalctl --vacuum-time=2d、使用journalctl --vacuum-size=500M和临时设置SystemMaxUse=/etc/systemd/journald.conf 中的为一个非常低的值。
所有这些似乎都会清除整个日志,影响所有单位。我只需要清除单个单元的条目。这可能吗?
如果您想使用 sed 用字符串替换关键字,sed 会努力解释您的替换字符串。如果替换字符串碰巧包含 sed 认为特殊的字符,例如 '/' 字符,它将失败,除非您当然希望替换字符串包含告诉 sed 如何操作的字符。
前任:
VAR="hi/"
sed "s/KEYWORD/$VAR/g" somefile
Run Code Online (Sandbox Code Playgroud)
有没有办法告诉 sed 不要尝试解释特殊字符的替换字符串?我想要的只是能够用变量的内容替换文件中的关键字,无论该内容是什么。
我经常使用 btrfs 快照,我感兴趣的一件事是给定快照占用了多少空间 - 或者更具体地说 - btrfs 快照占用了多少独占数据,以便我知道是否删除快照,我会释放多少空间。
我知道找出这些信息的唯一方法是启用 btrfs 配额
# btrfs quota enable /
Run Code Online (Sandbox Code Playgroud)
和跑步
# btrfs qgroup show /
Run Code Online (Sandbox Code Playgroud)
这是非常有效的。问题是 - 我实际上并没有将 btrfs 配额用于除此之外的任何其他用途,这意味着我可以选择始终启用 btrfs 配额,或者在运行“btrfs qgroup show /”命令之前暂时启用它们,并且立即禁用它们。另外,最后我听说,btrfs 配额仍然是实验性的(我错了吗?)。
基本上我想知道的是:
我意识到“安全起见”的答案是只在我需要时启用配额,但我实际上正在制作一个运行“btrfs qgroup show /”的脚本并以更易读的形式打印输出,并添加代码始终启用和禁用配额会大大减慢脚本的速度,并增加复杂性,所以我宁愿一直启用配额,但我不知道它是否有缺点。
我在这台机器上运行 Arch:
3.40GHz i7 六核 (4930K)
16GB DDR3 1600MHz 内存
Raid0 中的 2 个三星 840 EVO SSD(使用 BTRFS raid)
当我在我的 Arch 上使用几个虚拟机(2 或 3 个)运行 VMware 时,每个虚拟机大约有 2-4 个内核,每个内核有 2GB 内存,我的系统开始随机冻结。每隔几分钟,系统就会冻结 10 到 30 秒,然后再次开始移动,仅在 30 秒后冻结,直到我关闭虚拟机。当系统冻结时,鼠标仍然可以正常移动,但主机上的应用程序停止响应 - vmware 没有响应,firefox(也在主机上打开)没有响应,等等。
当冻结发生时,如果我正在运行进程监视器,它确实会显示 vmware 使几个内核最大化,但同时,还有其他未使用的内核。我也有足够多的内存——虚拟机总共使用了 6GB,主机还剩下 10GB。我有 0 个交换空间,因此交换不会减慢任何速度。
有报道称,由于 btrfs 导致文件系统级别的文件碎片化,虚拟机可能运行缓慢。然而,据我所知,碎片只是传统硬盘上的一个问题 - SSD 没有可搜索的读头,所以他们不在乎文件是否高度碎片化。
这在我运行 Debian 7 时从未发生过,所以我很确定这不是硬件问题。
我可以运行哪些工具来找出为什么我的系统一直死机?我已经尝试过 top/htop 和 iotop(当系统冻结时,没有过多的写入或读取)。btrfs 似乎没有任何类型的活动监视器来判断它是否在跟上写入/读取任何内容时遇到问题。还有什么我可以尝试的吗?
$ date -d "Apr 1 2016 - 1 month" +%B
Run Code Online (Sandbox Code Playgroud)
给了我“三月”,这很棒 - 四月之前的月份是三月。但是,如果我这样做:
$ date -d "$(date -d "Apr 1 2016") - 1 month" +%B
Run Code Online (Sandbox Code Playgroud)
它给了我“二月”。这在我拥有的一些更复杂的代码中导致了一个错误。为什么这两个命令显示不同的结果?
我不想做任何疯狂的事情 - 只是测量客户端到服务器的下载和上传速度。
在服务器上我运行:
iperf3 -s
Run Code Online (Sandbox Code Playgroud)
在客户端我运行:
iperf3 -c IP_ADDESS
Run Code Online (Sandbox Code Playgroud)
这些是我的结果:
Connecting to host IP_ADDRESS, port 5201
[ 4] local LAN_IP port 2722 connected to IP_ADDRESS port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.01 sec 256 KBytes 2.08 Mbits/sec
[ 4] 1.01-2.01 sec 128 KBytes 1.05 Mbits/sec
[ 4] 2.01-3.01 sec 128 KBytes 1.05 Mbits/sec
[ 4] 3.01-4.01 sec 128 KBytes 1.05 Mbits/sec
[ 4] 4.01-5.01 sec 128 KBytes 1.05 Mbits/sec
[ 4] 5.01-6.01 sec 128 KBytes 1.05 …Run Code Online (Sandbox Code Playgroud) 如果您使用此代码:
echo -e '\t\t\tString' | grep '^[\t]*String'
Run Code Online (Sandbox Code Playgroud)
结果是空白,因为它不匹配,但是:
echo -e '\t\t\tString' | grep $'^[\t]*String'
Run Code Online (Sandbox Code Playgroud)
作品。我发誓我一定在我的脚本和终端中使用了第一行的代码一百次,从来没有使用过这样的“$”字符,而且它似乎总是有效。最近有什么变化吗?为什么需要“$”字符?还是我做错了什么?
我有一台 Arch linux 机器,它使用以下 fstab 条目来挂载共享:
//192.168.3.1/Documents /mnt/ cifs credentials=/home/tal/.smbcredentials,rw,x-systemd.automount,iocharset=utf8,file_mode=0600,dir_mode=0700,uid=tal 0 0
Run Code Online (Sandbox Code Playgroud)
共享文件夹的服务器是 Windows 服务器,共享文件夹所在的分区是 NTFS。
使用上面的 fstab 条目,共享在启动时挂载就好了。正如预期的那样,所有文件 at at/mnt/似乎都归 'tal' 所有,并且权限为 0600。/mnt 下新创建的文件也归 tal(无论它们是由 root 还是 tal 创建),并且按预期具有 0600 权限.
问题是,如果我在 /mnt 下有一个文件:
-rw------- tal root 1000 test.txt
Run Code Online (Sandbox Code Playgroud)
我在上面运行这个:
sed -i -e '1,2d' test.txt
Run Code Online (Sandbox Code Playgroud)
要删除前 2 行,将删除 2 行,但文件的权限更改为:
-r-------- tal root 1000 test.txt
Run Code Online (Sandbox Code Playgroud)
为什么 sed 会更改文件权限?查看 test.txt 的 inode,我可以看出 sed 的-i选项使用新内容重新创建文件而不是修改文件,但这应该无关紧要 - 所有新创建的文件/mnt都应该获得 0600 权限。
作为测试,我用 vim 修改了同一个文件并检查了 inode。Vim 也会就地重新创建文件而不是修改它,但是当 vim …
如果我有这样的功能:
TEST()
{
if [[ "$1" == "hi" ]]
then
exit 1
fi
echo "Some text"
}
Run Code Online (Sandbox Code Playgroud)
如果我在当前 shell 中运行该函数:
TEST "hi"
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作。函数中的 if 语句为真,整个脚本将退出。另一方面,如果我这样做:
FUNCTION_OUTPUT=$(TEST "hi")
Run Code Online (Sandbox Code Playgroud)
这样我就可以在变量中从函数中捕获标准输出,函数内的 if 语句仍然为真,“exit 1”仍将触发,但由于我们在子 shell 中运行,脚本将继续运行。
不是使用 VAR_NAME=$() 在子shell中运行某些东西并将其分配给变量,有没有办法在当前shell中运行它,以便我的函数中的“exit 1”行实际上退出整个脚本?
我有一台服务器需要在端口 443 上接受 TCP 连接,确定连接是 OpenVPN 客户端还是 HTTPS 客户端,然后将其转发到我的 Web 服务器或 OpenVPN 服务器。
SSLH 是专门为此目的而设计的,并且看起来效果很好。唯一的问题是,虽然将其设置为非透明模式对我来说效果很好,但使用透明模式却给我带来了麻烦。
有人可以解释透明模式应该如何工作背后的理论吗?
SSLH指南说,为了透明地使用 SSLH,您需要:
transparent: true;
CapabilityBoundingSet=... CAP_NET_ADMIN ...,所以我假设这已经由 SystemD 完成我在示例中了解到,iptables 被告知用 0x1 标记标记源端口为 22 或 4443 的任何数据包,创建一条规则以使任何标记为 0x1 的数据包使用路由表 100,并创建路由表 100设置某种执行某些操作的本地路由。
为什么这些 iptables 规则和路由是必要的?该路线实际上在做什么?我认为路由应该位于 Web 服务器和 OpenVPN 服务器上,并指向 SSLH ip,但这似乎对我也不起作用。
===
更新:我突然想到,这可能是一条指向本地主机的路由,因为在示例中,服务器都在同一台计算机上,并且它们希望来自实际服务器的回复数据包在离开之前通过 SSLH机器。听起来对吗?如果是这样,如果我的服务器位于不同的机器上,我该怎么办?在这些机器上设置流量标记和返回 SSLH 服务器的路由?
更新 …
bash ×3
btrfs ×2
networking ×2
sed ×2
shell-script ×2
arch-linux ×1
cifs ×1
date ×1
freeze ×1
iptables ×1
logs ×1
performance ×1
permissions ×1
quoting ×1
routing ×1
samba ×1
smb ×1
systemd ×1
variable ×1
vmware ×1