Home > fundamental > something we should know about SHELL script

something we should know about SHELL script

1.ssh 调用远程nohup &脚本

工作需要,需要到批量到多个机器上执行一些nohup &脚本,写了个脚本,但是发现老师不成功:

ssh $ip "cd /root/test;nohup sh xxoo.sh &"

这个并没有起到后台执行的效果,ssh仍需要等待。
改成如下即可:

ssh $ip "cd /root/test;nohup sh xxoo.sh>/dev/null 2>&1 </dev/null &"

上面是将远端的xxoo.sh in,out,err重定向了,不再跟ssh端有交互即可。如果xxoo.sh内容就是nohup sh xxoo2.sh &,ssh那句里面nohup &就可以省略了,效果一样的。
参考:
nohup
Getting ssh to execute a command in the background on target machine(stackoverflow)

2.loop里面调用ssh会自动break的问题

while read ip
do
ssh $ip "sh xxoo.sh"
done<ip.list

上面ip.list作为输入,但同事ssh 也会获取输入信息,所以会出现循环break的情况。
改成如下即可:

ssh $ip "sh xxoo.sh"</dev/null
或者:
ssh –n $ip "sh xxoo.sh"

man ssh参考:
-n      Redirects stdin from /dev/null (actually, prevents reading from stdin).  This must be used when ssh is run in the background.  A common trick is
to use this to run X11 programs on a remote machine.  For example, ssh -n shadows.cs.hut.fi emacs & will start an emacs on shadows.cs.hut.fi,
and the X11 connection will be automatically forwarded over an encrypted channel.  The ssh program will be put in the background.  (This does
not work if ssh needs to ask for a password or passphrase; see also the -f option.)

3.ssh 远程执行本地脚本

这个功能,之前一直以为只能先把要执行的脚本分发到remote机器上,然后用ssh $ip “sh xxoo.sh”的方式去执行,最近才发现这样做其实多余了。
直接把STDIN在本地重定向即可:

ssh $ip <xxoo.sh

这样就不会因为一个临时小需求就往线上机器分发各种乱七八糟的脚本了。

4. sed
需要正则匹配的时候可以用sed -r来匹配真正的正则
需要在匹配行之后添加一行:sed ‘/asdf/a qifeng.cao’ t.txt
需要在匹配行之前添加一行:sed ‘/asdf/i qifeng.cao’ t.txt

5.

Categories: fundamental Tags:
  1. No comments yet.
  1. No trackbacks yet.