Articles of bash

获得一个进程的交换使用

我正在寻找一种方法,从一个shell脚本,以获得特定进程的交换使用。 顶部可以显示此信息,但仅限于交互模式。 批处理模式将仅显示.toprc存在时的自定义设置,但不能在命令行上指定特定的.toprc。 我发现这个脚本 ,但是在我的服务器上/ proc / * / smaps中没有交换项: # find /proc/ -maxdepth 1 -type d -regex '^/proc/[0-9]+$' -exec grep -Hi swap '{}'/smaps \; # 所以脚本只为每个进程输出0。 有没有办法find这些信息? 我在RHEL5.1 2.6.18-53.el5 x86_64上。 编辑: 要清楚的是,当我询问“交换使用情况”时,我指的是已经被分页到交换文件系统(当前不在主内存中)的进程使用的内存量。 假设没有更好的方法,我将默认使用(虚拟 – rss)通过ps -o vsz,rss的值来计算它。

grep不一致默认为grep -P?

我有一个脚本,当从交互式shell调用时,它可以完美地工作,但是在被cron调用时什么也不做。 为了解决这个问题,我使用以下命令启动了一个带有“空白”环境的shell: env -i /bin/bash –noprofile –norc 使用这个空白的env我挖了我的脚本,发现下面的grep将不匹配任何文件: grep -il "^ws_status\s*=\s*[\"']remove[\"']$" 但是,从交互式shell运行时,该命令将返回匹配文件的文件名。 注意,expression式是匹配的行如: WS_STATUS = "remove" 通过反复试验,我发现在选项[Perl regex]中join-P ,命令开始在'空白'shell中正常工作。 但是,我不知道为什么我的loginshell似乎默认为grep -P 。 只有一个grep二进制文件/bin/grep 没有为grep=pgrep或grep="grep -P"定义别名 没有定义envvariablesGREP_OPTIONS 。 这里的交易是什么? 注意:OS是RHEL v5.10,Bash是v3.2.25,grep是v2.5.1

使用tc qdiscs进行带宽限制

我试图限制一个简单的iperf服务器和客户端之间的带宽,使用第三个被动机器作为桥梁。 在没有干扰的情况下,iperf返回〜90 Mbits / sec的带宽。 我的目标是创build一个根qdisc发送所有未分类的stream量(一切)到一个儿童HTB类,我的带宽设置,然后路由到叶qdisc,其中一旦我得到这个工作,将设置额外的tc参数。 我的实施很简单: sudo tc qdisc add dev $interface root handle 1: htb default 10 sudo tc class add dev $interface parent 1:0 classid 1:10 htb rate $bandwidth burst $burst sudo tc qdisc add dev $interface parent 1:10 handle 10:0 netem #other stuff goes here 当这个bash脚本在$interface = eth1 , $bandwidth = […]

使脚本成为一个Linux服务

– 编辑,还有一些问题 – OK我的脚本使用一个循环来等待networking连接。 所以当我运行它时,即使是守护进程,它也会坐在那里,不会把我带回壳。 我尝试了su -c "/home/webreports/report-list &" USER但它试图以用户身份运行,即使我在引号中,我甚至试过单引号。 – 原始 – 我做了一个脚本(还有待testing)作为服务运行一个bash脚本。 我有两个问题。 1)我如何获得它作为一个特定的用户运行? 我们使用的软件不能以根用户身份运行,如果它真的发生了可怕的错误(可怕的软件,我们可悲的坚持)。 那么我如何让它运行服务作为用户“JOEBOB”可以说。 2)我只是把脚本文件放到“/etc/rc5.d”中才能使用“service report-listen start”? —脚本 – #!/bin/sh # # myservice This shell script takes care of starting and stopping # the /home/webreports/report-listen # # Source function library . /etc/rc.d/init.d/functions # Do preliminary checks here, if any #### START […]

Freebsd在Putty中不显示命令输出

我刚刚安装了FreeBSD的最新稳定版本到电脑,我有以下问题: 如果在Putty中,我发出一个像ps uxa这样的输出很长的命令,就会被裁剪 ps uxa 。 ps uxa|more没有帮助。 即使我做ps uxa > file.txt ,文件中的行被裁剪为80个字符! 有一些图像如何:http: //yfrog.com/0rfilecroppx 干净的安装后,这一切发生,一切都设置为默认。 默认的shell是csh,把它改成bash没有帮助。 这在Linux中从来没有发生过。 我的单身 – 一个 FreeBSD freebsd.localdomain 8.0-RELEASE FreeBSD 8.0-RELEASE #0: Sat Nov 21 15:48:17 UTC 2009 [email protected]:/usr/obj/usr/src/sys/GENERIC i386 如何解决这个问题? 我已经看过env vars,.profile,.cshrc,/etc/login.conf。

腻子+ Bash +屏幕,历史不起作用的向上箭头(Ubuntu 11.10)

我有一个新的Ubuntu服务器11.10安装,我通过PuTTylogin到SSH。 当我在屏幕内时,我不能使用向上的箭头来回忆bash的历史(尽pipe这在屏幕之外)。 我似乎无法findInterwebs上的完全相同的问题(尽pipe许多类似的问题)。 我的.screenrc如下: # Look and feel caption always "%{= bb}%{+bw}Screen: %n | %h %=%t %c" hardstatus alwayslastline "%-Lw%{= BW}%50>%n%f* %t%{-}%+Lw%<" # Our warning of activity activity "Activity in %t(%n)" # Left Right meta key mods #ALT-,. and ALT-<> bindkey "^[<" eval number !echo $WINDOW-1|bc bindkey "^[>" eval number !echo $WINDOW+1|bc bindkey "^[," prev […]

如何获取由/ bin / su -c启动的进程的PID

我正在为java-app编写一个init.d脚本。 但是,java-app应该由其他用户运行。 (我使用的操作系统是Debian Squeeze。) 我已经得到这个: /bin/su – $USER – c "cd $PATH;echo $PASSWORD | $JAVA -Xmx256m -jar $PATH/app.jar -d > /dev/null" & PID=$! /bin/su – $USER – c "echo $PID > $PIDFILE" 但是这当然只会保存“/ bin / su”进程的pid,而不是创build的java进程的pid。

通过ssh在远程服务器上使用本地LS_COLORS,而无需修改远程服务器

我可以访问大量不同的ssh帐户,我想象了几百个,我在不同的场合使用。 其中一些是个人的,其中一些是我从客户那里获得的,并且是共享的,而其中的一些是暂时的。 创build一次使用,一段时间后会自动删除。 现在我的问题是,我使用两个.dircolors,一个灯光和一个黑暗的主题。 我非常喜欢这个设置,但是这意味着每当我login到一台服务器上时,都会拷贝一个新的.dir文件,而共享的帐号偶尔也会让其他人恼火。 我试图修改我的SSH脚本,让我使用我的本地LS_COLORS,但我有一些问题。 如果我使用: ssh -t vps2 'export LS_COLORS="'$LS_COLORS'"; exec /bin/bash –noprofile –norc' ssh -t vps2 'export LS_COLORS="'$LS_COLORS'"; exec /bin/bash –noprofile –norc'它可以工作,但不完全可用,因为它忽略了所有的系统默认信息。 如果我使用: ssh -t vps2 'export LS_COLORS="'$LS_COLORS'"; exec /bin/bash' ssh -t vps2 'export LS_COLORS="'$LS_COLORS'"; exec /bin/bash'这是行不通的,因为bash通过.profile并加载一个不同的LS_COLORS。 有关如何加载默认的.bash_profile / .bashrc并有我自己的LS_COLORS的build议?

运行分离的屏幕会话,但没有终止在同一个bash

这里已经有很多这样的问题 ,但是每个人都推荐以下解决scheme(变体): screen -dmS somename bash -c "/path/to/script; bash -l" 例如script结束时,运行一个新的bash 。 不幸的是,这不适合我,因为 该script使用$ BASHPIDvariables的东西 script运行永远运行,例如需要用CTRL-C来终止它 和终止后, 我必须有相同的 shell运行script (相同的$BASHPID ) 所以,问题是: 如何以分离模式启动screen (例如在启动时) – 通常这是由-dm完成的 它必须启动shell 最好,如果它可以启动它作为“login”shell,例如什么读取我的.profile ,但是这可以通过script本身的source ~/.profile来克服 script启动一些其他(二进制)程序什么会运行,直到CTRL-C 并在script终止后,我必须得到相同的bash (与$BASHPID相同(因为需要运行另一个脚本什么是依赖于它) 总之需要模拟下面的交互工作: 开始screen echo $BASHPID 运行一些命令在屏幕内(最后一个运行,直到CTRL-C) – 例如运行/path/to/script 分离(ctrl-a d) 以上,后来我可以做 重新连接( screen -ARR ) CTRL-C 并可以继续…相同 echo $BASHPID #将产生与上面相同的结果 任何想法? (想想-X但它不工作,我可能犯了一个错误的地方)

从bash脚本检测Ubuntu键盘

请原谅我对linux操作系统/硬件问题的无知……我只是一个程序员:) 我有一个应用程序调用一些bash脚本来启动外部应用程序,在这种情况下Firefox。 该应用程序运行在具有触摸屏function的自助服务terminal上。 启动Firefox时,我还启动了一个虚拟键盘应用程序,允许用户input键盘。 但是,信息亭也有PS / 2和USB插槽,可以让用户插入键盘。 如果插入了键盘,如果我不需要启动虚拟键盘并为Firefox窗口提供更多的屏幕空间,那将会很好。 有没有办法让我检测是否从bash脚本中插入了键盘? 它会显示在/ dev中,如果是,它会显示在一个一致的位置? 如果用户使用PS / 2或USB键盘,它会有所作为吗? 谢谢!