一些常用的shell写法

对shell还不是很熟悉,平时遇到问题就要查资料,在这里开一个文档,记录一下以后遇到的常用的可复用的常用命令

1、覆盖和追加,常用在操作配置文件或者日志文件中

在文件后面追加内容
cat /template/hosts >> /etc/hosts
将文件内容覆盖
cat /template/hostname > /etc/hostname

 

2、获取某个进程的进程号或者杀掉某些进程

ps -ef |grep superset |grep -v grep |awk '{print $2}'

如果要杀掉这些进程,可以这么写,最后的sh是必须的,不然不会执行kill命令
ps -ef |grep superset |grep -v grep |awk '{print "kill -9 " $2}' |sh

 

3、判断某个进程运行是否正常,基本可以如下写,根据情况更换一下grep的条件

例如判断mysql运行是否正常
systemctl status mysql |grep "active (running)" >/dev/null
if [ $? -eq 0 ];then
    echo "running"
else
    echo "stopped"
fi

 

4、安装数据库后执行一些初始化,主要展示EOF的用法

例如mysql安装后初始化数据以及设置用户名密码,并开放对外访问,可以类似这样
systemctl start mysql;
mysql -uroot <<EOF
  source init-data.sql;
  USE mysql;
  UPDATE user SET authentication_string=password('xxxxx'),plugin='mysql_native_password' WHERE user=root';
  GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'xxxxx' WITH GRANT OPTION;
  FLUSH PRIVILEGES;
EOF

例如pg数据库,初始化设置用户密码以及创建新用户和创建数据库
systemctl start postgresql
su - postgres << EOF
  psql -c " ALTER USER postgres WITH PASSWORD 'xxxx'"
  psql -c " create user pg-user with password 'xxxx';"
  psql -c " create database db-xxx with owner pg-user;"
EOF

 

5、对于有交互式的输入,EOF就不太好用了,可以用expect(限于篇幅点到为止,不展开了),但是需要先安装yum包

  yum -y install expect

以交互式的创建用户信息为例,创建create-user.sh文件,然后在需要交互式创建用户的脚本中调用这个sh文件即可,例如

bin/create-user.sh admin zhang yanhua zyh@admin.com xxxxx >> /opt/install.log

下面是是create-user.sh代码,很简单就是expect检测当前到了哪一步,对应send相应的内容

#!/usr/bin/expect
set timeout 10
set username [lindex $argv 0]
set firstname [lindex $argv 1]
set lastname [lindex $argv 2]
set email [lindex $argv 3]
set password [lindex $argv 4]

spawn fabmanager create-admin --app superset
expect "Username" {send "$username\r"}
expect "first" {send "$firstname\r"}
expect "last" {send "$lastname\r"}
expect "Email" {send "$email\r"}
expect "Password" {send "$password\r"}
expect "confirmation" {send "$password\r"}

expect eof

 再例如scp拷贝文件

#!/usr/bin/expect
set timeout 10  
set username [lindex $argv 0]  
set password [lindex $argv 1]  
set hostname [lindex $argv 2]  
spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $username@$hostname
expect {
            #first connect, no public key in ~/.ssh/known_hosts
            "Are you sure you want to continue connecting (yes/no)?" {
            send "yes\r"
            expect "password:"
                send "$password\r"
            }
            #already has public key in ~/.ssh/known_hosts
            "password:" {
                send "$password\r"
            }
            "Now try logging into the machine" {
                #it has authorized, do nothing!
            }
        }
expect eof

 

6、让组件后台运行的一种方法,有时候组件的启动命令是前台运行的,占用控制台导致无法执行后续命令,如不是必须前台运行的话可以添加&让他后台运行,不影响继续执行后面的shell命令

前台运行,会一直占用控制台,不能再继续执行shell命令
superset runserver
后端运行,不占用控制台,可以继续执行其他shell命令
superset runserver&

 

7、常用的几个判断,文件、目录是否存在、文件是否包含某些内容

目录是否存在
if [ ! -d '/etc/monit.d' ]; then
   mkdir -p /etc/monit.d
fi

文件是否存在
if [ ! -f "/etc/test.conf" ]; then
   touch /etc/test.conf
fi

文件内是否包含某个字符串
if cat /opt/install.log |grep 'Admin User admin created';then
   echo 'create user success....' >> /opt/install.log
else
   echo 'create user failed....' >> /opt/install.log
fi

8、定时任务crontab命令中如果直接使用service、systemctl时会报错,因为找不到环境变量,所以遇到类似命令报错的问题,可以先刷一下环境变量

# 举个例子,用. /etc/profile刷新环境变量就能正常执行
*/30 * * 1 * . /etc/profile;service network restart >> /opt/temp.log 2>&1

 

posted @ 2020-04-30 17:11  张艳华  阅读(806)  评论(0编辑  收藏  举报