标签 DolphinScheduler 下的文章

Apache DolphinScheduler3.1.9+Minio 海报

目录

这里按照官方提供的文档进行操作:

前提

官方提供的开发手册位置

1、软件要求

在搭建 DolphinScheduler 开发环境之前请确保你已经安装以下软件:

  • Git
  • JDK: v1.8.x (当前暂不支持 jdk 11)
  • Maven: v3.5+
  • Node: v16.13+ (dolphinScheduler 版本低于 3.0, 请安装 node v12.20+)
  • Pnpm: v6.x

2、克隆代码库

通过你 git 管理工具下载 git 代码,下面以 git-core 为例

mkdir dolphinscheduler
cd dolphinscheduler
git clone git@github.com:apache/dolphinscheduler.git

3、编译源码

支持的系统:
* MacOS
* Linux
【这个我没有运行试试】
运行 `mvn clean install -Prelease -Dmaven.test.skip=true`

DolphinScheduler 普通开发模式

上面是官方提供的,我觉得有用就复制下来,

这里开始我就按照自己的操作顺序记录

1、编译问题:

1、git相关
1-1:开启 Windows Git 长路径支持,
管理员 PowerShell 执行,解决 DolphinScheduler 路径太深导致 git add 失败
git config --system core.longpaths true

1-2:先初始化git仓库,只在本地,不涉及账号、不推远程,Spotless 需要 HEAD
git init
git add .
git commit -m "initial commit"

2、Maven 编译 / 格式化(IDEA 里的 Terminal)
2-1:依赖 Git HEAD,自动修复格式问题
mvn spotless:apply
2-2:编译整个项目(跳过测试),确保所有模块已 install
mvn clean install -DskipTests

3、前端相关:

查看 Node.js 是否已安装
node -v

查看 npm 版本
npm -v

安装 pnpm
npm install -g pnpm
pnpm -v

编译都没有问题

2、启动zookeeper

官方内容

下载 ZooKeeper,解压

存储配置

启动脚本

搞个txt编辑完后,后缀该bat即可

@echo off
echo 正在启动 ZooKeeper...
cd /d E:\\install\\ZooKeeper\\zookeeper-3.8.3\\bin
zkServer.cmd
pause

3、workspace.xml 修改

【可以不用,我也是看其他文章有添加的,不过我没添加也能正常运行,这里只做记录】

在其他文章看到说在这里添加这行,说是让 IDEA 在运行时动态使用模块的 classpath,而不是用启动时生成的静态 classpath。

注意点:
这个作用只会影响本地 IDEA 启动,线上环境如果有问题这个是解决不了的。

"dynamic.classpath": "true",

4、数据库

我这里用的是mysql,所以需要修改

4-1:数据初始化
创建名为【dolphinscheduler】的新数据库后,
把这个位置的sql直接拷贝复制执行即可。

如图:

4-2:依赖相关修改
如果使用 MySQL 作为元数据库,需要先修改 `dolphinscheduler/pom.xml`,
将 `mysql-connector-java` 依赖的 `scope` 改为 `compile`,
使用 PostgreSQL 则不需要

test 改成 compile

5、application.yaml 修改数据库配置

5-1:dolphinscheduler-master
如图,配置文件中修改这些数据:三个内容都是一样的

spring:
  config:
    activate:
      on-profile: mysql
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/dolphinscheduler?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: 账户名
    password: 数据库密码

5-2:dolphinscheduler-worker

5-3:dolphinscheduler-api

6、logback-spring.xml 修改日志级别

6-1:dolphinscheduler-master
<appender-ref ref="STDOUT"/>

6-2:dolphinscheduler-worker

6-3:dolphinscheduler-api

7、启动后端三个服务

我们需要启动三个服务,包括 MasterServer,WorkerServer,ApiApplicationServer

* MasterServer:在 Intellij IDEA 中执行 `org.apache.dolphinscheduler.server.master.MasterServer` 中的 `main` 方法,并配置 *VM Options* `-Dlogging.config=classpath:logback-spring.xml -Ddruid.mysql.usePingMethod=false -Dspring.profiles.active=mysql`

* WorkerServer:在 Intellij IDEA 中执行 `org.apache.dolphinscheduler.server.worker.WorkerServer` 中的 `main` 方法,并配置 *VM Options* `-Dlogging.config=classpath:logback-spring.xml -Ddruid.mysql.usePingMethod=false -Dspring.profiles.active=mysql`

* ApiApplicationServer:在 Intellij IDEA 中执行 `org.apache.dolphinscheduler.api.ApiApplicationServer` 中的 `main` 方法,并配置 *VM Options* `-Dlogging.config=classpath:logback-spring.xml -Dspring.profiles.active=api,mysql`。启动完成可以浏览 Open API 文档,地址为 http://localhost:12345/dolphinscheduler/swagger-ui/index.html

> VM Options `-Dspring.profiles.active=mysql` 中 `mysql` 表示指定的配置文件
7-1:MasterServer
配置 VM Options
按照操作配置这个:打开后填入即可

-Dlogging.config=classpath:logback-spring.xml -Ddruid.mysql.usePingMethod=false -Dspring.profiles.active=mysql

7-2:WorkerServer
配置 VM Options

跟上面一样操作:

-Dlogging.config=classpath:logback-spring.xml -Ddruid.mysql.usePingMethod=false -Dspring.profiles.active=mysql
7-3:ApiApplicationServer
配置 VM Options
-Dlogging.config=classpath:logback-spring.xml -Dspring.profiles.active=api,mysql

总的就这三个:

8、启动前端服务

命令:
安装前端依赖并运行前端组件

cd dolphinscheduler-ui
pnpm install
pnpm run dev

9、浏览器访问

账号密码:
浏览器访问:
http://localhost:5173/home

默认账号密码:

账号:admin
密码:dolphinscheduler123
成功访问:

相关问题

1、存储未启用、租户\用户 指定

问题:测试能否创建文件夹、上传文件等,提示【存储未启用】

问题:当前登录用户的租户信息未被指定

解决方法:

Minio 安装、启动

我这里直接用minio来尝试:

1、minio 创建 dolphinscheduler 桶

2、commom.properties 修改

配置文件改了这些地方

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# user data local directory path, please make sure the directory exists and have read write permissions
data.basedir.path=/tmp/dolphinscheduler

# resource view suffixs
#resource.view.suffixs=txt,log,sh,bat,conf,cfg,py,java,sql,xml,hql,properties,json,yml,yaml,ini,js

# resource storage type: HDFS, S3, OSS, NONE
# ljh -->   S3 is Minio--------------------------------------
resource.storage.type=S3
# resource store on HDFS/S3 path, resource file will store to this base path, self configuration, please make sure the directory exists on hdfs and have read write permissions. "/dolphinscheduler" is recommended
resource.storage.upload.base.path=/dolphinscheduler

# ljh --> The account and password of MinIO-------------------------------
# The AWS access key. if resource.storage.type=S3 or use EMR-Task, This configuration is required
resource.aws.access.key.id=minioadmin
# The AWS secret access key. if resource.storage.type=S3 or use EMR-Task, This configuration is required
resource.aws.secret.access.key=minioadmin
# The AWS Region to use. if resource.storage.type=S3 or use EMR-Task, This configuration is required
resource.aws.region=cn-north-1
# ljh --> add bucket ------------------------------
# The name of the bucket. You need to create them by yourself. Otherwise, the system cannot start. All buckets in Amazon S3 share a single namespace; ensure the bucket is given a unique name.
resource.aws.s3.bucket.name=dolphinscheduler
# You need to set this parameter when private cloud s3. If S3 uses public cloud, you only need to set resource.aws.region or set to the endpoint of a public cloud such as S3.cn-north-1.amazonaws.com.cn
# ljh --> localhost convert  127.0.0.1
resource.aws.s3.endpoint=http://127.0.0.1:9000

# alibaba cloud access key id, required if you set resource.storage.type=OSS
resource.alibaba.cloud.access.key.id=<your-access-key-id>
# alibaba cloud access key secret, required if you set resource.storage.type=OSS
resource.alibaba.cloud.access.key.secret=<your-access-key-secret>
# alibaba cloud region, required if you set resource.storage.type=OSS
resource.alibaba.cloud.region=cn-hangzhou
# oss bucket name, required if you set resource.storage.type=OSS
resource.alibaba.cloud.oss.bucket.name=dolphinscheduler
# oss bucket endpoint, required if you set resource.storage.type=OSS
resource.alibaba.cloud.oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com

# if resource.storage.type=HDFS, the user must have the permission to create directories under the HDFS root path
resource.hdfs.root.user=hdfs
# if resource.storage.type=S3, the value like: s3a://dolphinscheduler; if resource.storage.type=HDFS and namenode HA is enabled, you need to copy core-site.xml and hdfs-site.xml to conf dir
resource.hdfs.fs.defaultFS=hdfs://mycluster:8020

# whether to startup kerberos
hadoop.security.authentication.startup.state=false

# java.security.krb5.conf path
java.security.krb5.conf.path=/opt/krb5.conf

# login user from keytab username
login.user.keytab.username=hdfs-mycluster@ESZ.COM

# login user from keytab path
login.user.keytab.path=/opt/hdfs.headless.keytab

# kerberos expire time, the unit is hour
kerberos.expire.time=2

# resourcemanager port, the default value is 8088 if not specified
resource.manager.httpaddress.port=8088
# if resourcemanager HA is enabled, please set the HA IPs; if resourcemanager is single, keep this value empty
yarn.resourcemanager.ha.rm.ids=192.168.xx.xx,192.168.xx.xx
# if resourcemanager HA is enabled or not use resourcemanager, please keep the default value; If resourcemanager is single, you only need to replace ds1 to actual resourcemanager hostname
yarn.application.status.address=http://ds1:%s/ws/v1/cluster/apps/%s
# job history status url when application number threshold is reached(default 10000, maybe it was set to 1000)
yarn.job.history.status.address=http://ds1:19888/ws/v1/history/mapreduce/jobs/%s

# datasource encryption enable
datasource.encryption.enable=false

# datasource encryption salt
datasource.encryption.salt=!@#$%^&*

# data quality option
data-quality.jar.name=dolphinscheduler-data-quality-dev-SNAPSHOT.jar

#data-quality.error.output.path=/tmp/data-quality-error-data

# Network IP gets priority, default inner outer

# Whether hive SQL is executed in the same session
support.hive.oneSession=false

# use sudo or not, if set true, executing user is tenant user and deploy user needs sudo permissions; if set false, executing user is the deploy user and doesn't need sudo permissions
sudo.enable=true
setTaskDirToTenant.enable=false

# network interface preferred like eth0, default: empty
#dolphin.scheduler.network.interface.preferred=

# network IP gets priority, default: inner outer
#dolphin.scheduler.network.priority.strategy=default

# system env path
#dolphinscheduler.env.path=dolphinscheduler_env.sh

# development state
development.state=false

# rpc port
alert.rpc.port=50052

# set path of conda.sh
conda.path=/opt/anaconda3/etc/profile.d/conda.sh

# Task resource limit state
task.resource.limit.state=false

# mlflow task plugin preset repository
ml.mlflow.preset_repository=https://github.com/apache/dolphinscheduler-mlflow
# mlflow task plugin preset repository version
ml.mlflow.preset_repository_version="main"

# ljh --> minio must open path style
resource.aws.s3.path.style.access=true
3、dolphinscheduler 可视化页面添加租户

安全中心 - 租户管理 - 创建租户

用户添加租户

演示

创建文件夹、上传文件成功

如图,数据已经存放在我指定的minio文件夹里面了

前情提要

佬需要扩展我司调度平台(Dolphinscheduler)集群的节点数,故有了下面的脚本

部分脚本经过 AI 生成和自行调试,不能发的话管理可以删除

PS: Dolphinscheduler 是一个很不错的开源分布式调度平台,有大量调度任务的佬可以看看

就是这个了

GitHub - apache/dolphinscheduler: Apache DolphinScheduler is the modern data orchestration platform. Agile to create high performance workflow with low-code

创建用户

总结
# 创建用户并赋予免密sudo权限 sudo useradd user1
echo "user1@123" | sudo passwd --stdin user1
sudo sed -i '$auser1  ALL=(ALL)  NOPASSWD: ALL' /etc/sudoers

设置 host 映射

总结
# 做这个是为了在节点间相互连接时方便 #!/bin/bash # ================= 配置区域 =================
base=10.1.xxx.
HOSTS="${base}1 ${base}2 ${base}3"
USER="user1"
PASS="user1@2023" # 这里最好要统一各个节点的账号密码方便节点间连接 # 待新增的配置块 (使用 Here Document 生成) cat > hosts_to_add.tmp << EOF
10.1.xxx.1 node1
10.1.xxx.2 node2
10.1.xxx.3 node3
.... # 此处省略n个
EOF
# 为了防止重复添加,我们需要定义一个列表来清理这些新节点可能的旧记录 # 提取新文件中的所有主机名用于清理 CLEAN_NEW_NODES_PATTERN="node1|node2|node3|..." # =========================================== # 检查 sshpass if ! command -v sshpass &> /dev/null; then echo "❌ 请先安装 sshpass: yum install sshpass -y" exit 1 fi echo "========================================" echo "开始批量修改 /etc/hosts" echo "========================================" for IP in $HOSTS; do echo ">> 正在处理节点: $IP" # 1. 上传新配置块到远程临时目录 sshpass -p "$PASS" scp -o StrictHostKeyChecking=no hosts_to_add.tmp "$USER@$IP:/tmp/hosts_chunk" if [ $? -ne 0 ]; then echo " ❌ 上传文件失败,跳过该节点" continue fi # 2. 远程执行 Sudo 操作 REMOTE_CMD="
echo '$PASS' | sudo -S -p '' bash -c '
cp /etc/hosts /etc/hosts.bak_\$(date +%Y%m%d_%H%M) && \
sed -i -E \"/$CLEAN_NEW_NODES_PATTERN/d\" /etc/hosts && \
cat /tmp/hosts_chunk >> /etc/hosts && \
rm -f /tmp/hosts_chunk
'
"
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "$USER@$IP" "$REMOTE_CMD" if [ $? -eq 0 ]; then echo " ✅ 修改成功" # 简单验证一下行数变化 sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "$USER@$IP" "grep -c 'node1' /etc/hosts" | xargs -I {} echo " 📊 验证: 包含 node1 的行数: {} (应为 1)" else echo " ❌ 修改失败 (可能是 sudo 密码错误或权限不足)" fi echo done # 清理本地临时文件 rm -f hosts_to_add.tmp echo "全部完成。" # 执行完脚本的效果是每个节点的host都包含集群所有节点的IP记录

配置节点间免密连接

总结
#!/bin/bash # 以下是配置ds master服务的脚本,worker api类似 # ================= 配置区域 ================= # 目标节点 IP 列表
base=10.1.xxx.
HOSTS="${base}1 ${base}2 ${base}3"
USER="user1"
PASS="user1@2023" # 本地临时汇总文件
ALL_KEYS_FILE="./all_node_keys.tmp" # 0. 环境检查与清理
> "$ALL_KEYS_FILE" if ! command -v sshpass &> /dev/null; then echo "[Init] 正在安装 sshpass..." if [ -f /etc/redhat-release ]; then sudo yum install sshpass -y
    elif [ -f /etc/debian_version ]; then sudo apt-get install sshpass -y
    else echo "❌ 请先手动安装 sshpass" exit 1
    fi fi echo "========================================" echo "阶段一:生成密钥并收集公钥" echo "========================================" for IP in $HOSTS; do echo ">> [收集] 正在处理节点: $IP" # 1.1 远程生成密钥 (如果不存在)
    sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "$USER@$IP" \
        "if [ ! -f ~/.ssh/id_rsa ]; then ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa; fi" # 1.2 读取公钥并追加到本地汇总文件
    sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "$USER@$IP" "cat ~/.ssh/id_rsa.pub" >> "$ALL_KEYS_FILE" # 确保追加一个换行符,防止拼接错误 echo "" >> "$ALL_KEYS_FILE" done # 检查是否收集成功 if [ ! -s "$ALL_KEYS_FILE" ]; then echo "❌ 未收集到公钥,请检查网络或密码。" exit 1
fi echo "" echo "========================================" echo "阶段二:安全追加配置 (保留原有密钥)" echo "========================================" for IP in $HOSTS; do echo ">> [追加] 正在同步到节点: $IP" # 2.1 上传汇总文件到远程的 /tmp 目录 (不直接覆盖 authorized_keys)
    sshpass -p "$PASS" scp -o StrictHostKeyChecking=no "$ALL_KEYS_FILE" "$USER@$IP:/tmp/new_keys_bundle" # 2.2 远程执行合并逻辑 # 逻辑说明: # 1. mkdir: 确保目录存在 # 2. touch: 确保文件存在 # 3. sed: 确保文件最后一行有换行符(防止追加到上一行末尾) # 4. cat >>: 追加新密钥 # 5. sort -u: 排序并去重 (关键!防止反复执行导致文件膨胀) # 6. chmod: 修正权限
    REMOTE_CMD="
mkdir -p ~/.ssh && \
touch ~/.ssh/authorized_keys && \
sed -i -e '\$a\\' ~/.ssh/authorized_keys && \
cat /tmp/new_keys_bundle >> ~/.ssh/authorized_keys && \
sort -u ~/.ssh/authorized_keys -o ~/.ssh/authorized_keys && \
sed -i '/^$/d' ~/.ssh/authorized_keys && \
chmod 700 ~/.ssh && \
chmod 600 ~/.ssh/authorized_keys && \
rm -f /tmp/new_keys_bundle
"
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "$USER@$IP" "$REMOTE_CMD" if [ $? -eq 0 ]; then echo " ✅ 成功追加并去重" else echo " ❌ 操作失败" fi done # 3. 清理本地临时文件 rm -f "$ALL_KEYS_FILE" echo "" echo "========================================" echo "全部完成!原有密钥已保留,新节点已互信。" echo "验证方法: ssh $USER@${base}1 'ssh ${base}2 date'" echo "========================================" # 此脚本执行完的效果是所有节点间都可以免密直连(dolphinscheduler不强制要求这个) # 后续再有新加节点直接在HOST中追加,重新执行脚本即可

配置 Dolphinscheduler 的系统服务

总结
#!/bin/bash # 此脚本的作用是把ds-worker进程做成系统服务,以便在进程被杀死或机器重启时自动重启 # ================= 配置区域 =================
base=10.1.xxx.
HOSTS="${base}1 ${base}2 ${base}3"
USER="user1"
PASS="user1@2023" # 临时文件存放路径
LOCAL_SERVICE_FILE="./ds_worker.service" # =========================================== # 检查 sshpass if ! command -v sshpass &> /dev/null; then echo "❌ 请先安装 sshpass" exit 1
fi # 1. 在本地生成标准的 Service 文件 # 注意:使用 'EOF' (带单引号) 防止 $MAINPID 被 Shell 解析成变量 cat > "$LOCAL_SERVICE_FILE" << 'EOF'
[Unit]
Description=DolphinScheduler worker Service
After=network.target

[Service]
Type=forking
User=user1
Environment=JAVA_HOME=/mnt/vos-jddsq55k/software/jdk1.8.0_152
WorkingDirectory=/mnt/vos-jddsq55k/software/dss320
ExecStart=/mnt/vos-jddsq55k/software/dss320/bin/dolphinscheduler-daemon.sh start worker-server
ExecStop=/mnt/vos-jddsq55k/software/dss320/bin/dolphinscheduler-daemon.sh stop worker-server
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target
Alias=ds-worker.service
EOF

echo "========================================" echo "批量部署 ds-worker 服务" echo "========================================" for IP in $HOSTS; do echo ">> 正在处理节点: $IP" # 2. 上传文件到远程的 /tmp 目录 (普通用户有权限)
    sshpass -p "$PASS" scp -o StrictHostKeyChecking=no "$LOCAL_SERVICE_FILE" "$USER@$IP:/tmp/ds_worker.service" if [ $? -ne 0 ]; then echo "   ❌ 文件上传失败" continue fi # 3. 远程执行:移动文件到系统目录 + 启动服务 # 逻辑: # - mv: 从临时目录移动到系统目录 (覆盖) # - daemon-reload: 让 systemd 识别新文件 # - enable --now: 设置开机自启并立即启动 # - status: 检查状态
    
    REMOTE_CMD="
echo '$PASS' | sudo -S -p '' bash -c '
mv /tmp/ds_worker.service /usr/lib/systemd/system/ds_worker.service && \
chmod 644 /usr/lib/systemd/system/ds_worker.service && \
systemctl daemon-reload && \
systemctl enable ds_worker && \
systemctl restart ds_worker
' && \
systemctl status ds_worker | grep 'Active:'
"
sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "$USER@$IP" "$REMOTE_CMD" if [ $? -eq 0 ]; then echo " ✅ 部署并启动成功" else echo " ❌ 启动失败,请检查路径或权限" fi echo done # 清理本地临时文件 rm -f "$LOCAL_SERVICE_FILE" echo "全部完成。" # 此脚本执行完,所有节点都启动了ds-worker的进程

配置日志清理任务

总结
#!/bin/bash # ================= 配置区域 =================
base=10.1.xxx.
HOSTS="${base}1 ${base}2 ${base}3"
USER="user1"
PASS="user1@2023" # 定义要添加的两条 Crontab 任务 # 注意:这里不需要转义 *,因为后面我们会小心处理字符串
TASK_MASTER="0 0 * * * find /mnt/vos-jddsq55k/software/dss320/master-server/logs -mtime +7 -exec rm -rf {} \;"
TASK_WORKER="0 0 * * * find /mnt/vos-jddsq55k/software/dss320/worker-server/logs -mtime +30 -exec rm -rf {} \;" # =========================================== if ! command -v sshpass &> /dev/null; then echo "❌ 请先安装 sshpass" exit 1
fi echo "========================================" echo "批量添加日志清理 Crontab 任务" echo "========================================" for IP in $HOSTS; do echo ">> 正在处理节点: $IP" # 构造远程执行的脚本块 # 使用 Here Document 传递复杂的逻辑,避免 SSH 引号地狱 # 注意:EOF 必须不带引号,以便本地变量 TASK_MASTER 能被解析 # 但是!find 命令里的 {} 和 \; 需要小心,不要被本地 Shell 解析 # 所以下面 TASK 变量里的 \; 我在上面定义时已经写好了
    
    REMOTE_SCRIPT=$(cat << EOF
# 1. 导出当前 crontab 到临时文件 (如果没有任务则创建一个空文件)
crontab -l > /tmp/cron.tmp 2>/dev/null || touch /tmp/cron.tmp

# 2. 定义标志位,看是否有修改
MODIFIED=0

# 3. 检查并添加 Master 清理任务
# grep -F: 固定字符串匹配,忽略星号的特殊含义
if ! grep -Fq "master-server/logs" /tmp/cron.tmp; then
echo "$TASK_MASTER" >> /tmp/cron.tmp
echo " + 已添加 Master 日志清理任务"
MODIFIED=1
else
echo " = Master 任务已存在,跳过"
fi

# 4. 检查并添加 Worker 清理任务
if ! grep -Fq "worker-server/logs" /tmp/cron.tmp; then
echo "$TASK_WORKER" >> /tmp/cron.tmp
echo " + 已添加 Worker 日志清理任务"
MODIFIED=1
else
echo " = Worker 任务已存在,跳过"
fi

# 5. 如果有修改,则重新加载 Crontab
if [ \$MODIFIED -eq 1 ]; then
crontab /tmp/cron.tmp
echo " ✅ Crontab 更新成功"
else
echo " ok 无需变更"
fi

# 6. 清理临时文件
rm -f /tmp/cron.tmp

# 7. 验证:显示当前的 crontab 内容
echo " 👀 当前 Crontab 预览:"
crontab -l
EOF
) # 执行远程命令 sshpass -p "$PASS" ssh -o StrictHostKeyChecking=no "$USER@$IP" bash -c "'$REMOTE_SCRIPT'" echo done # 此脚本执行后会在每个节点添加crontab任务来清理过期日志

一些其他常用 Linux 命令的总结

查看占用 CPU 最多进程

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head
ps -aux | sort -k3nr | head 5

linux 下获取占用内存资源最多

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head
ps -aux | sort -k4nr | head 5

查看程序运行时间

ps -eo pid,user,command,lstart,etime|grep xxx
ps -p PID -o lstart,etime,command 

查看程序内存溢出记录

grep "Out of memory" /var/log/messages

查看开机自启服务列表

systemctl list-unit-files|grep enable 

释放内存

echo 1 > /proc/sys/vm/drop_caches

按关键字搜索文件

grep -rl "key word" /path

批量替换文本内容

sed -i "s/demomanage.wbsjk.com/devrr.aoyuntech.com/g"  `grep demomanage.wbsjk.com -rl .`

插入内容到文件头

sed -i '1i\export JAVA_HOME=\/usr\/local\/openjdk-8' /etc/profile

Redis 批量删除

redis-cli -h 172.17.48.144 -p 63791 -n 5 keys *BEAU*|xargs redis-cli -p 63791 -h 172.17.48.144 -n 5 del

删除大批量数据

ls|xargs -n 10 rm -rf ls

删除 3 天以前文件

upload_path=/tmp/upload
download_path=/tmp/download
find $upload_path -mtime +3|xargs -d '\n' rm -rf {} \;
find $download_path -mtime +3|xargs -d '\n' rm -rf {} \;

追加文件

cat >> ~/.bashrc << EOF
export JAVA_HOME=/opt/path/java/jdk1.8.0_152
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
EOF

觉得有用的佬可以点个赞,打赏一下也是可以的哈哈


📌 转载信息
原作者:
zzzxdm
转载时间:
2026/1/9 10:07:17