我有时会在xargs一夜之间运行很长时间的工作,并且在早上发现xargs中间某个地方死了真的很烦人,例如因为在一个特殊情况下的分段错误,就像今晚发生的那样。
即使一个xargs孩子被杀死,它也不会处理任何更多的输入:
控制台 1:
[09:35:48] % seq 40 | xargs -i --max-procs=4 bash -c 'sleep 10; date +"%H:%M:%S {}";'
xargs: bash: terminated by signal 15
09:35:58 3
09:35:58 4
09:35:58 2
<Exit with code 125>
Run Code Online (Sandbox Code Playgroud)
控制台 2:
[09:35:54] kill 5601
Run Code Online (Sandbox Code Playgroud)
xargs一旦子进程终止并继续处理,我能否以某种方式阻止停止处理更多输入?
通常,$0在脚本中设置为脚本的名称,或者它被调用的任何内容(包括路径)。但是,如果我使用bash该-c选项,$0则设置为在命令字符串之后传递的第一个参数:
bash -c 'echo $0' foo bar
# foo
Run Code Online (Sandbox Code Playgroud)
实际上,位置参数似乎已经发生了变化,但包括$0. 但是shift在命令字符串中不影响$0(正常):
bash -c 'echo $0; shift; echo $0' foo bar
# foo
# foo
Run Code Online (Sandbox Code Playgroud)
为什么命令字符串的这种明显奇怪的行为?请注意,我正在寻找实施这种奇怪行为背后的原因和基本原理。
人们可以推测这样的命令字符串不需要$0通常定义的参数,因此为了经济起见,它也用于普通参数。但是,在这种情况下, 的行为shift很奇怪。另一种可能性是$0用于定义程序的行为(bash称为 assh或vim称为 as vi),但不能如此,因为$0这里仅在命令字符串中可见,而不是在其中调用的程序中可见。我想不出任何其他用途$0,所以我无法解释这一点。
您可以在内核命令行上输入“panic=N”,使系统在发生恐慌后 N 秒重新启动。
但是在引导加载程序发挥作用之前,是否有一个配置选项来指定这个(除了默认的内核命令行选项)?某些内核选项可能是?
例如,less具有选项--squeeze-blank-lines(或-s简而言之)并且它将多个空行压缩为单个空行,buuut,less不会将其用作过滤器(即,将其输出发送到不发送到 tty)。
也可以找到类似的选项cat,它也被称为-s通常,它也使单个空行而不是多个空行。
一起删除空行/空白行怎么样?我能想到的一种方法是使用grep,但可能我忽略了一些更简单的方法?
Linux 发行版倾向于(但不是必需的)包含freefrom procps,这可以很好地简洁地显示内存消耗:
# free -m
total used free shared buff/cache available
Mem: 7688 5027 180 827 2479 1589
Swap: 8189 2082 6106
Run Code Online (Sandbox Code Playgroud)
为了在 BSD 中近似这一点,我尝试了许多不同的项目,但它们都给了我不同的答案(大概是因为它们有不同的上下文?)。例如:
# sysctl -a |grep Memory
Virtual Memory: (Total: 1077397132K, Active 3458308K)
Real Memory: (Total: 1171952K Active 975744K)
Shared Virtual Memory: (Total: 56264K Active: 38652K)
Shared Real Memory: (Total: 22184K Active: 19700K)
Free Memory Pages: 1664588K
# sysctl hw |awk '/mem:/ { printf "%s %.0fM\n", $1, $2/1024^2 }'
hw.physmem: 32756M …Run Code Online (Sandbox Code Playgroud) 在 FreeBSD 4.9 中,只需一个命令即可轻松完成,例如
jail [-u username] path hostname ip-number command
Run Code Online (Sandbox Code Playgroud)
如果路径是/你像往常一样运行相同的程序,但它的所有网络通信都被限制为仅使用给定的 IP 地址作为源。有时它非常方便。
现在在 Linux 中有 LXC,它看起来与 FreeBSD jail(或 Solaris 的区域)非常相似——你能想出类似的方式来执行程序吗?
我试图了解 FreeBSD ACL 和 Linux ACL 之间的行为差异。特别是默认 ACL 的继承机制。
我在 Debian 9.6 和 FreeBSD 12 上都使用了以下内容:
$ cat test_acl.sh
#!/bin/sh
set -xe
mkdir storage
setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
touch outside
cd storage
touch inside
cd ..
ls -ld outside storage storage/inside
getfacl -d storage
getfacl storage
getfacl outside
getfacl storage/inside
umask
Run Code Online (Sandbox Code Playgroud)
我从 Debian 9.6 得到以下输出:
$ ./test_acl.sh
+ mkdir storage
+ setfacl -d -m u::rwx,g::rwx,o::-,m::rwx storage
+ touch outside
+ cd storage
+ touch inside
+ cd ..
+ …Run Code Online (Sandbox Code Playgroud) 首先,Linux 检测分区:
sdg1: <solaris: [s0] sdg5 [s1] sdg6 [s2] sdg7 [s8] sdg8 >
Run Code Online (Sandbox Code Playgroud)
然而,FreeBSD 9.0 只显示主分区。是否可能仅支持 sparc64 的 Solaris 标签?
特别是当我输入以下键盘组合时:
<hold shift> [ <release shift> <enter>
我从 KDE 中退出并看到一些控制台输出的闪光,但我在任何日志中都找不到它。
我正在运行 Fedora 15(升级很困难)。
有没有人有任何想法?
更新:这发生在跨应用程序。在 Intellij IDE 中,在终端中。
更新:当我输入时也会发生= <hold shift> 2 <release shift>
更新:经过一番挖掘,我可以在 /var/log/messages 中看到它已将一些信息转储到 /var/spool/abrt/ccpp-2012-07-20-10:50:21-1395 并在其中告诉我知道 /usr/bin/Xorg 被发送了一个 SIGABRT。
要创建列标题,如下所示:
1234567890123456789
Run Code Online (Sandbox Code Playgroud)
我(正在尝试)使用 seq 和 echo:
seq -s '' 1 9 ; echo -n 0; seq -s '' 1 9
Run Code Online (Sandbox Code Playgroud)
但是, seq 在每次运行后都会输出一个换行符。我怎样才能避免这种情况?