之前一直用别人写的自动化脚本,自己写的很少,说实话Linux的三剑客至今还是懵懵懂懂的状态,没关系慢慢来。

基础知识必会

  • 查看服务器中某个脚本的位置
    • 比如说咱们经常用到的start-all.sh,一直在用却不知道在哪个位置,这就有点尴尬。
    • start-all.sh 脚本用于启动 Hadoop 集群中的所有组件,该脚本通常位于 Hadoop 安装路径下的 sbin 目录中。
1
2
# 通过脚本名称搜索该脚本的位置
sudo find / -name start-all.sh 2>/dev/null

运行结果

1
2
3
4
5
6
7
8
9
10
11
12
13
/usr/local/dolphinscheduler.bak/bin/start-all.sh
/usr/local/dolphinscheduler.bak/script/start-all.sh
/usr/local/dolphinscheduler-bin.bak/script/start-all.sh
/usr/local/dolphinscheduler-bin.bak/bin/start-all.sh
/usr/local/dolphin/bin/start-all.sh
/home/syy/spark_udf/spark-2.0.0/sbin/start-all.sh
/home/syy/spark_udf/spark-2.0.0/dist/sbin/start-all.sh
/home/yl/dolphin/apache-dolphinscheduler-3.0.0-src/script/start-all.sh
/home/yl/iam-audit/install/159/iam-audit/usr/local/hadoop-2.7.1/sbin/start-all.sh
/home/yl/iam-audit/install/159/iam-audit/usr/local/spark-2.0.0-bin-hadoop2.7/sbin/start-all.sh
/home/yl/iam-audit/install/150/iam-audit/usr/local/hadoop-2.7.1/sbin/start-all.sh
/home/yl/iam-audit/install/150/iam-audit/usr/local/spark-2.0.0-bin-hadoop2.7/sbin/start-all.sh
/opt/cloudera/parcels/CDH-6.0.1-1.cdh6.0.1.p0.590678/lib/spark/sbin/start-all.sh
  • Linux,和Windows系统中的换行格式
    • 在Linux和其他类Unix系统中,使用的是LF(Line Feed)字符作为换行符,表示为\n
    • 在Windows系统中,使用的是CRLF(Carriage Return + Line Feed)作为换行符,表示为\r\n

Shell脚本(参照)

源码

1
2
3
4
5
6
7
8
9
10
11
#/bin/bash
status=$(ps | grep 3proxy | grep -v "grep" | grep -v "daemon" | awk '{print $1}')
if [[ "$(printf '%s' "$status")" != '' ]]; then
echo "$(date) 3proxy ID is: $status, 3proxy is running!" >> /root/nb-iot-gw/scripts/daemon.log
else
cd /root/nb-iot-gw/src/
ulimit -c unlimited
/root/nb-iot-gw/src/3proxy configiot >>log &
echo "$(date) start up 3proxy $?" >> /root/nb-iot-gw/scripts/daemon.log
fi
exit 0;

解析

1
status=$(ps | grep 3proxy | grep -v "grep" | grep -v "daemon" | awk '{print $1}')
  1. ps 命令:用于列出当前正在运行的进程。

  2. grep 3proxy:用于过滤包含关键字 “3proxy” 的进程。

  3. grep -v "grep":用于排除包含关键字 “grep” 的行,以防止将 grep 命令自身作为结果之一。

  4. grep -v "daemon":用于排除包含关键字 “daemon” 的行,以防止将守护进程(如果有的话)作为结果之一。

  5. awk '{print $1}':用于提取第一列(即进程 ID 列)并输出。

  6. status的状态无非两种:

    • 如果存在多个匹配的进程,将只选择第一个匹配项。

    • 如果没有找到匹配的进程,则 status 变量将为空。

1
ulimit -c unlimited
  • ulimit 命令用于修改Shell环境中的资源限制。
  • -c 选项表示设置核心转储文件的大小限制。
  • unlimited 表示将核心转储文件的大小限制设置为无限制,即不限制核心转储文件的大小。

解释:

核心转储文件是在程序发生崩溃或异常终止时生成的一个记录了程序状态的文件,有助于进行故障排查和调试工作。通过使用 ulimit -c unlimited,可以将核心转储文件的大小限制设置为无限制,以确保在程序崩溃时生成完整的核心转储文件。

脚本Demo(等待测试上线

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#!/bin/bash

# 该程序的作用是启动一个任务,如果这个任务存在就kill 掉,接着重启
process_name='transLog.py'
path='/root/log/'
log_file='/root/log/trans.info'

function getToday(){
time_now=date +'%Y-%m-%d %H:%M:%S'
}

status=`ps -ef| grep $process_name | grep "python3" | grep -v grep | awk '{print $2}'`

if [ -n "$status" ];then
echo "$process_name is running! Then kill it"
kill -9 "$status"
cd "$path"
# 下面使用Python解释器的时候一定需要注意(不能直接写Python3,
nohup /usr/local/bin/python3 "$process_name" 2>&1 >> "$log_file"
else
echo "$process_name is not running. Restart it"
cd "$path"
nohup /usr/local/bin/python3 "$process_name" 2>&1 >> "$log_file"
fi
exit 0;