Unix & Linux

Linux,FreeBSD和其他类似Un * x的操作系统用户的问答

1
“高速缓存”存储器实际上是免费的吗?
运行时cat /proc/meminfo,您将在顶部获得以下三个值: MemTotal: 6291456 kB MemFree: 4038976 kB Cached: 1477948 kB 据我所知,“已缓存”值是Linux系统创建的磁盘缓存,如果任何应用程序需要更多RAM,它将立即释放,因此Linux永远不会用完内存,直到MemFree和“已缓存”都为零。 不幸的是,/ proc / meminfo没有报告“ MemAvailable”,可能是因为它在虚拟服务器中运行。(内核版本为4.4) 因此,出于所有实际目的,可用于应用程序的RAM是MemFree + Cached。 这种观点正确吗?
11 linux  memory  cache  meminfo 

2
为什么pwd不接受--physical之类的长选项?
当我显示pwd命令手册时,它说--physical支持长选项 $ man pwd PWD(1) User Commands PWD(1) NAME pwd - print name of current/working directory SYNOPSIS pwd [OPTION]... DESCRIPTION Print the full filename of the current working directory. -L, --logical use PWD from environment, even if it contains symlinks -P, --physical avoid all symlinks 但是,当我键入以下内容时,它将失败 $ pwd --physical -bash: …
11 bash  rhel  pwd 

1
将括号{}用作命令及其选项的参数的用法
例子 我最近发现了一些示例,这些示例使用成对的封闭括号{}作为命令甚至其选项的参数,而在括号之间没有任何东西: cat foo | xargs -I{} echo {} find . -size 0 -exec rm -i {} \; 没有文件 我的问题是我无法在GNU Bash手册中找到描述上述情况{}下用法的文档。 我不认为这是参数扩展,因为在参数扩展中必须在括起来的花括号之前加一个美元符号,例如${}。 它也不是大括号扩展名,因为它采用的形式{x..y[..incr]},其中x和y不是可选的。 它也不能作为命令分组,因为{}它用作参数。 问题 {}一般而言,一对封闭的括号作为接受它的任何命令的参数甚至意味着什么? 在哪里可以找到描述{}as参数用法的文档?
11 bash  shell 


1
如何搜索手册页中包含连字符的模式?
我试图找到一个命令来搜索所有手册页中包含连字符的模式。 我查看了man man,发现了以下3个选项: -K, --global-apropos 在所有手册页中搜索文本。这是蛮力搜索,可能需要一些时间。如果可以的话,应指定一个区域以减少需要搜索的页面数。搜索词可以是简单的字符串(默认值),也--regex可以是正则表达式(如果使用了该选项)。 -w,--where,--path,--location 实际上不显示手册页,而是打印将要格式化的源nroff文件的位置。 -S list,-s list,t--sections=list 列表是要搜索的特定于订单的手册部分的冒号或逗号分隔列表。此选项将覆盖$MANSECT环境变量。(-s拼写是为了与System V兼容。) 我试图结合它们来搜索模式mark-modified-lines,这是在man bash以下内容中描述的readline选项: $ man -s1 -Kw mark-modified-lines 但是找不到任何页面: No manual entry for mark-modified-lines 然后命令退出并显示代码16。 我以为该命令的语法可能是错误的,但似乎并非如此,因为此命令可以在我的系统上正确找到包含单词的5个手册页guitar: $ man -s1 -Kw guitar /usr/share/man/man1/ffmpeg-all.1.gz /usr/share/man/man1/ffserver-all.1.gz /usr/share/man/man1/ffplay-all.1.gz /usr/share/man/man1/ffmpeg-filters.1.gz /usr/share/man/man1/ffprobe-all.1.gz 我认为也许单词中的连字符引起了问题。在中man bash,我找到了--regex描述如下的选项: --regex 使用正则表达式显示所有页面,这些页面的名称或描述的任何部分均与每个页面参数匹配,作为正则表达式apropos(1)。由于在搜索正则表达式时通常没有合理的方法来选择“最佳”页面,因此此选项暗含-a。 我尝试使用此选项,并用mark-modified-linesregex 替换单词mark.modified.lines,其中连字符本身被.应与任何字符匹配的元字符替换: $ man -s1 -Kw --regex 'mark.modified.lines' …
11 man 

2
内核是否真的使用了所有内核参数?
为什么Linux允许'init = / bin / bash'? 我读了这篇文章,答案是说内核正在运行该初始化程序。 然后我开始怀疑,Linux通常带有一个initramfs,该initramfs最终将挂载和ivot_root到实际的根文件系统。那么,这种init说法是什么意思呢?initramfs中的路径?或者像我猜到的那样,它不是由内核读取的,而是由initramfs的init来执行真正的init的。 另外,root=UUID=xxxx论据是由内核读取还是由initramfs的init读取以找到真正的根文件系统? 似乎我可以将我想要的任何参数作为内核参数传递,因此它们是否全部由内核读取,或者至少其中一些仅对用户空间程序有意义?

2
为什么在创建子进程后立即调用exec()或exit()时使用vfork()?
操作系统概念和APUE说 通过vfork(),父进程被挂起,子进程使用父进程的地址空间。由于vfork()不使用写时复制,因此,如果子进程更改了父级地址空间的任何页面,则父级恢复后更改后的页面将对父级可见。因此,必须谨慎使用vfork(),以确保子进程不会修改父进程的地址空间。 vfork()旨在在子进程创建后立即调用exec()或exit()时使用。 我如何理解最后一句话? 当通过vfork()调用创建的子进程时exec(),是否exec()通过加载新程序来修改父进程的地址空间? 当通过vfork()调用创建子进程时,终止子进程时exit()是否 exit()不修改父进程的地址空间? 我偏爱Linux。 谢谢。
11 linux  process  exec  exit  vfork 


4
Linux系统时间暂时跳跃
我在某些(硬件)服务器中看到了一个奇怪的系统时间更改行为:在中/var/logs/syslog,每条日志消息之前的日期时间有时会更改为随机时间,而在下一条消息中会恢复为正常,如下所示: Feb 22 2018 09:09:30 ... Feb 22 2018 09:09:32 ... Jan 13 2610 15:37:42 ... Feb 22 2018 09:09:33 ... Feb 22 2018 09:09:34 ... 如示例中所示,日期时间的突然变化可能长达数百年。 我可以确认带有奇怪时间戳记的日志消息不是来自任何特定的过程,而是可以随机发生的。 两次异常时间更改之间的持续时间在几分钟到几小时之间不等(但是,我怀疑异常时间更改可能会更频繁地发生,但是由于系统日志不是每秒写入一次,因此许多未在系统日志中显示出来)。 另外,由于它发生在多个服务器上,因此我认为这不是硬件问题。 有关服务器的更多信息:它们是一个具有一个控制器和几个计算节点的开放式堆栈安装。每个服务器都有正在运行的ntp服务。控制器配置为从其自己的硬件时钟中抽出时间,并且计算节点服务器从控制器同步时间。请注意,每个服务器都会以自己的速度进行异常的时间更改-看起来“错误的时间”不是通过ntp从控制器同步的。 我怀疑计算节点上的来宾系统(虚拟机)可能会影响其主机系统时间。但这不能解释为什么控制器在不运行任何虚拟机时仍存在相同的问题。 我需要一种检测方法:谁更改了系统时间,它是如何发生的?
11 logs  timestamps  time 

5
在保持顺序的同时删除相邻的重复行
我有一个带有一列的文件,每个文件的名称重复多次。我想将每个重复压缩为一个,同时保留与相同名称的其他重复不相邻的任何相同名称的重复。 例如,我想将左侧转向右侧: Golgb1 Golgb1 Golgb1 Akna Golgb1 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna Akna Spata20 Spata20 Spata20 Golgb1 Golgb1 Golgb1 Akna Akna Akna 这就是我一直在使用的perl -ne 'print if ++$k{$_}==1' file.txt > file2.txt 方法:但是,此方法仅使左边代表一个(即,Golb1和Akna不再重复)。 有没有一种方法可以为每个块保留唯一的名称,同时保留在多个不相邻的块中重复的名称?
11 awk  sed  sort  uniq 

2
posix shell:打印环境变量名称列表(无值)
以与多种实现兼容的posix兼容方式,如何打印当前定义的环境变量列表而不包含它们的值? 在某些实现(mksh,freebsd / bin / sh)上,只需单独使用即可export: $ export FOO2 FOO 但是对于其他一些实现(bash,zsh,破折号),export也会显示该值。例如,使用bash: $ export export FOO2='as df\ asdk=fja:\ asd=fa\ asdf' export FOO='sjfkasjfd kjasdf:\ asdkj=fkajdsf:\ :askjfkajsf=asdfkj:\ safdkj' $ printenv | sed -n l FOO2=as\tdf\$ asdk=fja:\$ asd=fa\$ asdf$ FOO=sjfkasjfd kjasdf:\$ asdkj=fkajdsf:\$ \t:askjfkajsf=asdfkj:\$ safdkj$ 其他选项(例如,env或printenv没有选项)仅显示不带值的变量名,至少在我尝试过的linux和freebsd平台上不行。 管道到awk / sed / etc。或使用参数扩展技术(例如${foo%%=*})修剪列表是可以接受的,但是它必须使用可能跨越行且值中带有=空格的值(请参见上面的示例)。 特定于特定Shell实现的答案很有趣,但是我主要是在寻找在各个实现之间都兼容的东西。


3
Shell脚本:使用内部选项创建变量
我有一个带有以下参数的rsync命令: rsync -avz --{partial,stats,delete,exclude=".*"} 我想将该参数放在变量中以在脚本中重用。像这样: #!/bin/bash VAR=rsync -avz --{partial,stats,delete,exclude=".*"} $VAR /dir1 /dir2 我尝试使用引号,单引号,方括号,但未成功。

2
如何使ctrl + c / not /中断while循环?
鉴于此循环: while sleep 10s ; do something-that-runs-forever done 当我按Ctrl + C时,整个while循环都会中断。我想做的是中断“某事”过程,让10秒钟过去,然后重新启动“某事”。 如何使ctrl + c仅影响“某物”,而不影响while循环? 编辑:“中断”如SIGINT。杀。中止 终止。不像“暂停”中那样“中断”。
11 bash 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.