Linux下的并行神器——parallelGNU Parallel的输入源支持文件、命令行和标准输入(stdin或pipe) 。
当然,若不想像上面那样进行组合,可使用 --xapply 参数从每一个源获取一个参数(或文件一行),这个参数有些类似R中的函数,具有广播作用——如果其中一个输入源的长度比较短,它的值会被重复 。
GNU Parallel可以通过 --arg-sep 和 --arg-file-sep 指定分隔符替代 ::: 或 ::::,当这两个符号被其它命令占用的时候会特别有用 。
GNU Parallel默认把一行做为一个参数:使用 \n 做为参数定界符 。可以使用 -d 改变:
GNU Parallel支持通过 -E 参数指定一个值做为结束标志:
GNU Parallel使用--no-run-if-empty来跳过空行:
如果parallel之后没有给定命令,那么这些参数会被当做命令:
此外,命令还可以是一个脚本文件,一个二进制可执行文件或一个bash的函数(须用 export -f 导出函数)
GNU Parallel支持多种替换字符串,默认使用 {},使用 -I 改变替换字符串符号 {} 。其最常见的字符串替换包括以下几种: {.} ,去掉扩展名; {/} ,去掉路径 , 只保留文件名; {//},只保留路径; {/.} ,同时去掉路径和扩展名; {#} ,输出任务编号 。同时对于每一个字符串替换都可以自己指定符号: -I 对应 {} ; --extensionreplace 替换{.} ; --basenamereplace 替换{/} ; --dirnamereplace 替换 {//} ; --basenameextensionreplace 替换{/.} ; --seqreplace 替换{#}。
同时,如果有多个输入源时,可以通过 {编号} 指定某一个输入源的参数:
使用--header把每一行输入中的第一个值做为参数名 。
使用 --colsep 把文件中的行切分为列,做为输入参数 。
--xargs 会在一行中输入尽可能多的参数(与参数字符串长度有关),通过 -s 可指定一行中参数的上限 。
为了获得更好的并发性,GNU Parallel会在文件读取结束后再分发参数 。
GNU Parallel 在读取完最后一个参数之后 , 才开始第二个任务,此时会把所有的参数平均分配到4个任务(如果指定了4个任务) 。
第一个任务与上面使用--xargs的例子一样,但是第二个任务会被平均的分成4个任务,最终一共5个任务 。(奇怪的是我的结果与官网教程的结果不一样)
替换字符串可以是输出字符的一部分,使用 -m 参数表示每个job不重复输出“背景”(context),-X 则与 -m 相反,会重复输出“背景文本” , 具体通过下面几个例子进行理解:
使用-N限制每行参数的个数 , 其中 -N0 表示一次只读取一个参数 , 且不输入这个参数(作为计数器来使用) 。
如果命令行中包含特殊字符,就需要使用引号保护起来 。
perl脚本 'print "@ARGV\n"' 与linux的 echo 的功能一样 。
使用GNU Parallel运行这条命令的时候 , perl命令需要用引号包起来,也可以使用 -q 保护perl命令:
使用 --trim 去除参数两头的空格:
使用 --tag 以参数做为输出前缀,使用 --tagstring 修改输出前缀:
--dryrun 作用类似于echo:
--verbose 则在运行之前先打印命令:
一般来说,GNU Parallel 会延迟输出,直到一组命令执行完成 。使用 --ungroup,可立刻打印输出已完成部分 。
使用--ungroup会很快 , 但会导致输出错乱,一个任务的行输出可能会被另一个任务的输出截断 。像上例所示,第二行输出混合了两个任务: '4-middle' '2-start' 。使用--linebuffer 避免这个问题(稍慢一点):
强制使输出与参数保持顺序--keep-order/-k :
GNU Parallel可以把每一个任务的输出保存到文件中,临时文件默认保存在 /tmp 中,可以使用 --tmpdir改变(或者修改 $TMPDIR):
输出文件可以有结构的保存--results , 输出文件不仅包含标准输出(stdout)也会包含标准错误输出(stderr):
在使用多个变量的时候会显示很有用:
使用 --jobs/-j 指定并行任务数 。
通过使用--interactive在一个任务执行之前让用户决定是否执行 。
当job有大量的IO操作时,为避免 “惊群效应” ,可使用 --delay 参数指定各个job开始的时间间隔 。
若已知任务超过一定时间未反应则为失败则可以通过 --timeout 指定等待时间避免无谓的等待 。GNU parallel能计算所有任务运行时间的中位数,因此可以指定时间为中位数的倍数关系 。
GNU parallel有多种方式可用来动态的显示任务进度信息,如:
使用 --joblog 参数能够生成各个任务的日志文件:
通过 --resume-failed 参数可以重新运行失败的任务;--retry-failed 的作用与 --resume-failed 类似,只是 --resume-failed 从命令行读取失败任务,而 --retry-failed 则是从日志文件中读取失败任务:
GNU parallel支持在某一情况下(如第一个失败或成功时,或者20%任务失败时)终止任务,终止任务又有两种类型,其一为立即终止(通过 --halt now 指定),杀死所有正在运行的任务并停止生成新的任务,其二为稍后终止(通过 --halt soon 指定),停止生成新任务并等待正在运行任务完成 。
GNU parallel还支持在任务失败后重试运行 --retries :
关于终止信号的高级用法参考 官方入门文档。
GNU parallel能够在开始一个新的任务前检查系统的负载情况防止过载(通过 --load 可指定负载),同时还能检查系统是否使用了交换空间(swap)(通过 --noswap 限制使用swap) 。
同时,对于某些占用内存较多的程序,parallel会检查内存只有内存满足时才启动任务(通过 --memfree 指定需要内存大?。以谄舳挝窈竽诖娌还?0%时会杀掉最新开始的任务,直到这个任务完成再重新开始那些杀死的任务 。
还可以通过 --nice 来指定任务的优先级 。
可使用 -S host 来进行远程登陆:
parallel -S username@$SERVER1 echo running on ::: username@$SERVER1
GNU parallel 文件传输使用的是rsync 。
更多远程操作参见入门文档 。
--pipe 参数使得我们可以将输入(stdin)分为多块(block),然后分配给多个任务多个cpu以达到负载均衡,最后的结果顺序与原始顺序一致 。使用 --block 参数可以指定每块的大小,默认为1M 。
如果不关心结果顺序,只想要快速的得到结果,可使用 --round-robin 参数 。没有这个参数时每块文件都会启动一个命令,使用这个参数后会将这些文件块分配给job数任务(通过 --jobs 进行指定) 。若想分配更为均匀还可同时指定 --block 参数 。
参考:
官方文档
GNU Parallel指南
Linux日志管理神器之Logrotate日志分割,以及crontab定时轮询 有些服务linux神器命令,会自动产生大量linux神器命令的日志文件 , 如果不限制 , 会占用磁盘空间 。
如果单纯的用定时任务crontab删除,又不太灵活 , 这时需要日志神器logrotate 。
logrotate工具是系统自带为linux神器命令了方便进行日志管理而产生的一个工具 。
系统会定时运行 logrotate , 一般是每天一次 。也是基于定时任务crontab运行的 。
配置文件:
主配置文件的位置在 /etc/logrotate.conf,一般配置在 /etc/logrotate.d/子目录下 。
如系统默认日志配置:
配置文件参数:
更多信息请参考man logrotate帮助文档
模板是通用的,而配置参数则根据你的需求进行调整,不是所有的参数都是必要的 。
在上面的配置文件中,linux神器命令我们只想要轮询一个日志文件,size=50M 指定日志文件大小可以增长到 50MB,dateext 指 示让旧日志文件以创建日期命名 。
可自行参考/etc/logrotate.d/目录下系统默认的文件 。
logrotate命令:
具体 logrotate 命令格式如下:
要为某个特定的配置调用 logrotate:
排障过程中的最佳选择是使用-d选项以预演方式运行 logrotate 。要进行验证,不用实际轮循任何日志文件,可以模拟演练日志轮循并显示其输出 。
正如我们从上面的输出结果可以看到的,logrotate 判断该轮循是不必要的 。如果文件的时间小于一天,就会发生了 。
强制轮循即使轮循条件没有满足,我们也可以通过使用-f选项来强制 logrotate 轮循日志文件 , -v参数提供了详细的输出 。
个人项目配置:
项目每天可产生20G左右的日志,显示不能做每日轮询,所以额外需要添加定时任务做每小时,或者每隔多少分钟 。
如果轮询日志异常报错如下:
error: skipping “” because parent directory has insecure permissions (It’s world writable or writable by group which is not “root”) Set “su” directive in config file to tell logrotate which user/group should be used for rotation.”
需要加su root root选项 。
同时添加定时任务:
定时任务说明:
第一条,每隔40分钟轮询执行一次logrotate任务 。
第二条,每天凌晨4点删除前一天的日志,原因如下:
由于项目系统产生日志格式的原因,会导致以下情况:
如果昨天的分割到4个后(或者1,2 , 3),时间到第二天后,没法转储递增,会一直停留在4,没法删除,每天会有,久而久之,也会占用磁盘空间 。所以需要定时删除 。
设置完成
开启定时任务日志,以便查看定时任务是否执行 。后续可取消 。
重启rsyslog
Linux终端命令神器--Screen命令screenlinux神器命令的功能大体有三个linux神器命令:
会话恢复: 只要Screen本身没有终止linux神器命令 , 在其内部运行的会话都可以恢复 。
多窗口:在Screen环境下linux神器命令,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存 。
会话共享:Screen可以让一个或多个用户从不同终端多次登录一个会话 , 并共享会话的所有特性 。
安装screen:
# CentOS
yum install screen
# Debian/Ubuntu
apt install screen
Attached:表示当前screen正在作为主终端使用,为活跃状态 。
Detached:表示当前screen正在后台使用,为非激发状态 。
# 查看已存在终端
screen -ls
# 创建一个叫Hello的虚拟终端
screen -S Hello
# 进入虚拟终端32307
screen -r 32307
There is no screen to be resumed matching错误解决办法
1.在使用screen -r ******(id)重新连接程序界面时出现以下问题:
后来发现是因为突然断网,虽然重新连接,但之前的screen还是处于打开状态(1个screen无法同时打开2次),所以无法重新打开screen , 解决方法如下:
2.首先使用screen -d *****(id) , 先退出 , 然后再使用 screen -r *****(id)重新连接
【Linux操作】---终端神器tmux tmux(terminal multiplexer)是Linux上的终端复用神器linux神器命令,可从一个屏幕上管理多个终端(准确说是伪终端) 。使用该工具linux神器命令,用户可以连接或断开会话 , 而保持终端在后台运行 。类似的工具还有screen,个人对这二者的使用感受是,用过tmux就再也不想用screenlinux神器命令了 。
tmux的结构包括 会话 (session)、 窗口 (window)、 窗格 (pane)三部分,会话实质是伪终端的集合,每个窗格表示一个伪终端 , 多个窗格展现在一个屏幕上,这一屏幕就叫窗口 。基本结构及状态信息如下图所示:
基本的操作无非就是对会话、窗口、窗格进行管理,包括创建、关闭、重命名、连接、分离、选择等等 。
一般使用命令和快捷键进行操作 , 可在系统shell终端和tmux命令模式(类似vim的命令模式)下使用命令,或者在tmux终端使用快捷键 。
tmux默认的快捷键前缀是 Ctrl b (下文用 prefix 指代),按下前缀组合键后松开,再按下命令键进行快捷操作,比如使用 prefix d 分离会话(应该写作 prefix d 而不是 prefix d,因为 d 键不需要与 prefix 同时按下) 。
快捷键可以自定义,比如将前缀改为 Ctrl a ,但需要保留shell默认的 Ctrl a 快捷键,按如下所示修改~/.tmux.conf文件:
pre style="margin: 0px; padding: 0px; overflow: auto; overflow-wrap: break-word; font-family: "Courier New" !important; font-size: 12px !important;"1 set-option -g prefix C-a 2 unbind-key C-b 3 bind-key C-a send-prefix 4 bind-key R source-file ~/.tmux.conf ; display-message "~/.tmux.conf reloaded."/pre
现在已将原先的 Ctrl a 用 prefix Ctrl a 取代,即需要按两次 Ctrl a 生效 。
第4行的作用是使用 prefix r 重新加载配置文件,并输出提示,否则需要关闭会话后配置文件才能生效,也可手动加载配置文件 , 在tmux终端输入" prefix :" 进入命令模式,用 source-file 命令加载配置文件 。
注意,将多个命令写在一起作为命令序列时 , 命令之间要用空格和分号分隔 。
****常用命令****
tmux new 创建默认名称的会话(在tmux命令模式使用 new 命令可实现同样的功能,其他命令同理,后文不再列出tmux终端命令)
tmux new -s mysession 创建名为mysession的会话
tmux ls 显示会话列表
tmux a 连接上一个会话
tmux a -t mysession 连接指定会话
tmux rename -t s1 s2 重命名会话s1为s2
tmux kill-session 关闭上次打开的会话
tmux kill-session -t s1 关闭会话s1
tmux kill-session -a -t s1 关闭除s1外的所有会话
tmux kill-server 关闭所有会话
常用快捷键
prefix s 列出会话 , 可进行切换
prefix $ 重命名会话
prefix d 分离当前会话
prefix**** D 分离指定会话
prefix c 创建一个新窗口
prefix , 重命名当前窗口
prefix w 列出所有窗口 , 可进行切换
prefix n 进入下一个窗口
prefix p 进入上一个窗口
prefix l 进入之前操作的窗口
prefix 0~9 选择编号0~9对应的窗口
prefix . 修改当前窗口索引编号
prefix ' 切换至指定编号(可大于9)的窗口
prefix f 根据显示的内容搜索窗格
prefix关闭当前窗口
prefix % 水平方向创建窗格
prefix " 垂直方向创建窗格
prefix Up|Down|Left|Right 根据箭头方向切换窗格
prefix q 显示窗格编号
prefix o 顺时针切换窗格
prefix } 与下一个窗格交换位置
prefix { 与上一个窗格交换位置
prefix x 关闭当前窗格
prefix space(空格键) 重新排列当前窗口下的所有窗格
prefix ! 将当前窗格置于新窗口
prefix Ctrl o 逆时针旋转当前窗口的窗格
prefix t 在当前窗格显示时间
prefix z 放大当前窗格(再次按下将还原)
prefix i 显示当前窗格信息
tmux list-key 列出所有绑定的键 , 等同于 prefix ?
tmux list-command 列出所有命令
以上为tmux的常见操作,基本可以满足大部分的工作需求,至于更高端的操作待日后再整理 。
参看链接: tmux简明教程
【linux神器命令 linux 神器】关于linux神器命令和linux 神器的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 直播唱歌卖房话术,卖房直播技巧
- python新建字典有多行,python字典新建key
- 猫和老鼠赛车游戏,猫和老鼠比赛车
- java代码审计思路,java审计日志实现
- vb.netdxf编程的简单介绍
- SaP采购计划执行率,sap 采购
- 怎么看英伟达显卡显存频率,英伟达看显卡使用率
- 直播怎么开快手,直播怎么开快手店铺
- go语言和scala go语言和golang的区别