当前位置: 首页 > news >正文

7. Job与CronJob

Job 与 CronJob 控制器

​ 接下来给大家介绍另外一类资源对象:Job,我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在我们的 Kubernetes 集群中为我们提供了JobCronJob 两种资源对象来应对我们的这种需求。

Job 负责处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod 成功结束。而CronJob 则就是在 Job上加上了时间调度。

Job

​ 我们用 Job 这个资源对象来创建一个如下所示的任务,该任务负责计算 π 到小数点后 2000 位,并将结果打印出来,此计算大约需要 10 秒钟完成。对应的资源清单如下所示:

# job-pi.yaml
# 这是一个 Kubernetes Job 示例,用来计算圆周率的前 2000 位
apiVersion: batch/v1   # API 版本,Job 属于 batch/v1
kind: Job              # 资源类型:Job
metadata:name: pi
spec:template:spec:containers:- name: piimage: dockerpull.pw/perl:5.34.0command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]# command:#   perl           → 调用 Perl 解释器#   -Mbignum=bpi   → 加载 bignum 模块,支持大数计算,提供 bpi() 函数#   -wle           → Perl 参数,w=警告,l=自动换行,e=执行代码#   "print bpi(2000)" → 打印圆周率 π 的前 2000 位restartPolicy: Never   # Pod 失败时不会自动重启(Job 会根据策略重试)backoffLimit: 4            # Job 失败时的最大重试次数,超过就标记为失败

​ 我们可以看到 Job 中也是一个 Pod 模板,和之前的 Deployment、StatefulSet 之类的是一致的,只是 Pod 中的容器要求是一个任务,而不是一个常驻前台的进程了,因为需要退出,另外值得注意的是 JobRestartPolicy 仅支持 NeverOnFailure 两种,不支持 Always,我们知道 Job 就相当于来执行一个批处理任务,执行完就结束了,如果支持 Always 的话是不是就陷入了死循环了?

验证:

ubuntu@ubuntu:~$ kubectl get pod -l job-name=pi -w
NAME       READY   STATUS        RESTARTS   AGE
pi-mt84b   0/1     Pending       0          0s
pi-mt84b   0/1     Pending       0          0s
pi-mt84b   0/1     ContainerCreating   0          0s
pi-mt84b   1/1     Running             0          25s
pi-mt84b   0/1     Completed           0          27s
pi-mt84b   0/1     Completed           0          28s
pi-mt84b   0/1     Completed           0          29s
ubuntu@ubuntu:~$ kubectl describe job pi
Name:             pi
Namespace:        default
Selector:         batch.kubernetes.io/controller-uid=a0fc2d20-ac95-4512-bba2-28e19ba34ff5
Labels:           name=pi
Annotations:      <none>
Parallelism:      1
Completions:      1
Completion Mode:  NonIndexed
Suspend:          false
Backoff Limit:    4
Start Time:       Fri, 12 Sep 2025 03:00:07 +0000
Completed At:     Fri, 12 Sep 2025 03:00:12 +0000
Duration:         5s
Pods Statuses:    0 Active (0 Ready) / 1 Succeeded / 0 Failed
Pod Template:Labels:  batch.kubernetes.io/controller-uid=a0fc2d20-ac95-4512-bba2-28e19ba34ff5batch.kubernetes.io/job-name=picontroller-uid=a0fc2d20-ac95-4512-bba2-28e19ba34ff5job-name=piContainers:pi:Image:      dockerpull.pw/perl:5.34.0Port:       <none>Host Port:  <none>Command:perl-Mbignum=bpi-wleprint bpi(2000)Environment:   <none>Mounts:        <none>Volumes:         <none>Node-Selectors:  <none>Tolerations:     <none>
Events:Type    Reason            Age   From            Message----    ------            ----  ----            -------Normal  SuccessfulCreate  15s   job-controller  Created pod: pi-t9sc5Normal  Completed         10s   job-controller  Job completed
ubuntu@ubuntu:~$ kubectl get pods -A
NAMESPACE      NAME                             READY   STATUS      RESTARTS       AGE
default        pi-t9sc5                         0/1     Completed   0              80s
ubuntu@ubuntu:~$ kubectl logs pi-t9sc5
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275901
ubuntu@ubuntu:~$ 

​ 可以看到,Job 对象在创建后,它的 Pod 模板,被自动加上了一个 controller-uid=< 一个随机字符串 > 这样的Label 标签,而这个 Job 对象本身,则被自动加上了这个 Label 对应的 Selector,从而保证了 Job 与它所管理的Pod 之间的匹配关系。而 Job 控制器之所以要使用这种携带了 UID 的 Label,就是为了避免不同 Job 对象所管理的Pod 发生重合。

​ 上面我们这里的 Job 任务对应的 Pod 在运行结束后,会变成 Completed 状态,但是如果执行任务的 Pod 因为某种原因一直没有结束怎么办呢?同样我们可以在 Job 对象中通过设置字段 spec.activeDeadlineSeconds 来限制任务运行的最长时间,比如:

spec:activeDeadlineSeconds: 100

​ 那么当我们的任务 Pod 运行超过了 100s 后,这个 Job 的所有 Pod 都会被终止,并且的终止原因会变成DeadlineExceeded

​ 如果的任务执行失败了,会怎么处理呢,这个和定义的restartPolicy 有关系,比如定义如下所示的 Job 任务,定义restartPolicy: Never 的重启策略:

# job-failed-demo.yaml
apiVersion: batch/v1
kind: Job
metadata:name: job-failed-demo
spec:template:spec:containers:- name: test-jobimage: dockerpull.pw/busybox# 故意输错命令command: ["echo123", "test failed job!"]restartPolicy: Never

验证:

ubuntu@ubuntu:~$ kubectl get pods -A
NAMESPACE      NAME                             READY   STATUS       RESTARTS       AGE
default        job-failed-demo-2cmr7            0/1     StartError   0              55s
default        job-failed-demo-mh47x            0/1     StartError   0              31s
default        job-failed-demo-v4s4c            0/1     StartError   0              68s
kube-flannel   kube-flannel-ds-67vbh            1/1     Running      9 (91m ago)    8d
kube-flannel   kube-flannel-ds-ghhhg            1/1     Running      8 (91m ago)    8d
kube-flannel   kube-flannel-ds-w666x            1/1     Running      8 (91m ago)    8d
kube-system    coredns-674b8bbfcf-6rjbh         1/1     Running      9 (91m ago)    8d
kube-system    coredns-674b8bbfcf-s85b7         1/1     Running      9 (91m ago)    8d
kube-system    etcd-master                      1/1     Running      12 (91m ago)   8d
kube-system    kube-apiserver-master            1/1     Running      11 (91m ago)   8d
kube-system    kube-controller-manager-master   1/1     Running      11 (91m ago)   8d
kube-system    kube-proxy-6bgf7                 1/1     Running      9 (91m ago)    8d
kube-system    kube-proxy-ddms4                 1/1     Running      10 (91m ago)   8d
kube-system    kube-proxy-hrqpb                 1/1     Running      9 (91m ago)    8d
kube-system    kube-scheduler-master            1/1     Running      12 (91m ago)   8d
ubuntu@ubuntu:~$ kubectl describe pod  job-failed-demo-v4s4c
...
Events:Type     Reason     Age   From               Message----     ------     ----  ----               -------Normal   Scheduled  113s  default-scheduler  Successfully assigned default/job-failed-demo-v4s4c to node2Normal   Pulling    113s  kubelet            Pulling image "busybox"Normal   Pulled     110s  kubelet            Successfully pulled image "busybox" in 2.938s (2.938s including waiting). Image size: 2223685 bytes.Normal   Created    110s  kubelet            Created container: test-jobWarning  Failed     110s  kubelet            Error: failed to create containerd task: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: exec: "echo123": executable file not found in $PATH: unknown
...

​ 可以看到当我们设置成 Never 重启策略的时候,Job 任务执行失败后会不断创建新的 Pod,但是不会一直创建下去,会根据 spec.backoffLimit 参数进行限制,通过该字段可以定义重建 Pod 的次数。

​ 但是如果我们设置的 restartPolicy: OnFailure 重启策略,则当 Job 任务执行失败后不会创建新的 Pod 出来,只会不断重启 Pod,比如将上面的 Job 任务 restartPolicy 更改为 OnFailure 后查看 Pod:

验证:

ubuntu@ubuntu:~/example/job_cron_job$ kubectl get pod -l job-name=job-failed-demo -w
NAME                    READY   STATUS              RESTARTS     AGE
job-failed-demo-vg87j   0/1     RunContainerError   3 (8s ago)   65s
job-failed-demo-vg87j   0/1     CrashLoopBackOff    3 (14s ago)   71s
job-failed-demo-vg87j   0/1     RunContainerError   4 (1s ago)    100s
job-failed-demo-vg87j   0/1     CrashLoopBackOff    4 (13s ago)   112s

​ 除此之外,我们还可以通过设置 spec.parallelism 参数来进行并行控制,该参数定义了一个 Job 在任意时间最多可以有多少个 Pod 同时运行。并行性请求(.spec.parallelism)可以设置为任何非负整数,如果未设置,则默认为 1,如果设置为 0,则 Job 相当于启动之后便被暂停,直到此值被增加。

spec.completions 参数可以定义 Job 至少要完成的 Pod 数目。如下所示创建一个新的 Job 任务,设置允许并行数为 2,至少要完成的 Pod 数为 8:

# job-para-demo.yaml
# 这是一个并行 Job 示例,运行 8 个任务,每次并行执行 2 个 PodapiVersion: batch/v1       # API 版本,Job 属于 batch/v1
kind: Job                  # 资源类型:Job
metadata:name: job-para-test      # Job 的名字,唯一标识
spec:parallelism: 2           # 并行 Pod 数量,Job 会同时运行 2 个 Podcompletions: 8           # Job 总共完成 8 个 Pod 任务,完成后 Job 状态为 Completetemplate:                # Pod 模板,定义 Job 创建的 Podspec:containers:          # Pod 内的容器列表- name: test-job  # 容器名称image: busybox  # 使用的镜像command: ["echo", "test parallel job!"]  # 容器启动时执行的命令restartPolicy: Never  # Pod 容器失败时不重启,由 Job 控制重试

验证:

ubuntu@ubuntu:~$ kubectl get pods -A
NAMESPACE      NAME                             READY   STATUS      RESTARTS        AGE
default        job-para-test-2jsts              0/1     Completed   0               109s
default        job-para-test-2w68f              0/1     Completed   0               104s
default        job-para-test-jlg2j              0/1     Completed   0               114s
default        job-para-test-p522l              0/1     Completed   0               2m5s
default        job-para-test-rggv6              0/1     Completed   0               2m
default        job-para-test-rpkqc              0/1     Completed   0               93s
default        job-para-test-trkqh              0/1     Completed   0               99s
default        job-para-test-wg2tv              0/1     Completed   0               4s

​ 可以看到一次可以有 2 个 Pod 同时运行,需要 8 个 Pod 执行成功,如果不是 8 个成功,那么会根据 restartPolicy 的策略进行处理,可以认为是一种检查机制。

​ 此外带有确定完成计数的 Job,即 .spec.completions 不为 null 的 Job, 都可以在其.spec.completionMode 中设置完成模式:

  • NonIndexed(默认值):当成功完成的 Pod 个数达到 .spec.completions 所设值时认为 Job 已经完成。换言之,每个 Job 完成事件都是独立无关且同质的。要注意的是,当 .spec.completions 取值为 null 时,Job被默认处理为 NonIndexed 模式。
  • Indexed:Job 的 Pod 会获得对应的完成索引,取值为 0 到 .spec.completions-1,该索引可以通过三种方式获取:
    • Pod 的注解 batch.kubernetes.io/job-completion-index
    • 作为 Pod 主机名的一部分,遵循模式 $(job-name)-$(index)。当你同时使用带索引的 Job(IndexedJob)与服务(Service),Job 中的 Pod 可以通过 DNS 使用确切的主机名互相寻址。
    • 对于容器化的任务,在环境变量 JOB_COMPLETION_INDEX 中可以获得。

当每个索引都对应一个成功完成的 Pod 时,Job 被认为是已完成的。

索引完成模式

​ 下面我们将运行一个使用多个并行工作进程的 Kubernetes Job,每个 worker 都是在自己的 Pod 中运行的不同容器。Pod 具有控制平面自动设置的索引编号(index number), 这些编号使得每个 Pod 能识别出要处理整个任务的哪个部分。

​ Pod 索引在注解 **batch.kubernetes.io/job-completion-index **中呈现,具体表示为一个十进制值字符串。为了让容器化的任务进程获得此索引,我们可以使用 downward API 机制来获取注解的值。而且控制平面会自动设置 DownwardAPI 在 JOB_COMPLETION_INDEX 环境变量中暴露索引。

配置清单

# job-indexed.yaml
# 这是一个 Indexed Job 示例,每个 Pod 会有一个唯一的索引 $JOB_COMPLETION_INDEX
apiVersion: batch/v1
kind: Job
metadata:name: indexed-job  # Job 名称
spec:completions: 5     # Job 总共需要完成 5 个 Podparallelism: 3     # Job 并行运行的 Pod 数量为 3 改成0就是串行了completionMode: Indexed  # 启用 Indexed 模式,每个 Pod 会有唯一索引 $JOB_COMPLETION_INDEXtemplate:spec:restartPolicy: Never  # Pod 容器失败时不重启,由 Job 控制重试# 初始化容器,用于生成每个 Pod 对应的数据initContainers:- name: "input"image: "bash"    # 用 bash 镜像执行脚本command:- "bash"- "-c"- |# 根据 Pod 索引生成不同的数据items=(foo bar baz qux xyz)echo ${items[$JOB_COMPLETION_INDEX]} > /input/data.txtvolumeMounts:- mountPath: /input  # 挂载共享目录name: input# 主容器,用于处理 initContainer 生成的数据containers:- name: "worker"image: "busybox"command:- "rev"- "/input/data.txt"  # 将 initContainer 文件内容反转输出!!!volumeMounts:- mountPath: /inputname: input# Pod 使用的卷volumes:- name: inputemptyDir: {}  # 临时目录,Pod 生命周期结束即销毁

验证:

ubuntu@ubuntu:~$ kubectl get pods -A
NAMESPACE      NAME                             READY   STATUS      RESTARTS         AGE
default        indexed-job-0-ddfbq              0/1     Completed   0                81s
default        indexed-job-1-kvwpr              0/1     Completed   0                81s
default        indexed-job-2-frnwp              0/1     Completed   0                6s
default        indexed-job-3-q86zs              0/1     Completed   0                62s
default        indexed-job-4-4r77m              0/1     Completed   0                59s
ubuntu@ubuntu:~$ kubectl get job
NAME          STATUS     COMPLETIONS   DURATION   AGE
indexed-job   Complete   5/5           83s        100s
ubuntu@ubuntu:~$ ubuntu@ubuntu:~$ kubectl logs indexed-job-1-kvwpr
Defaulted container "worker" out of: worker, input (init)
rab
ubuntu@ubuntu:~$ 

​ 当 JOB_COMPLETION_INDEX=3 的时候表示我们将 items[3] 的 qux 值写入到了 /input/data.txt 文件中,然后通过 volume 共享,在主容器中我们通过 rev 命令将其反转,所以输出结果就位 xuq 了。

​ 上面我们这个示例中每个 Pod 只做一小部分工作(反转一个字符串)。 在实际工作中肯定比这复杂,比如你可能会创建一个基于场景数据制作 60 秒视频任务的 Job,此视频渲染 Job 中的每个工作项都将渲染该视频剪辑的特定帧,索引完成模式意味着 Job 中的每个 Pod 都知道通过从剪辑开始计算帧数,来确定渲染和发布哪一帧,这样就可以大大提高工作任务的效率。

CronJob

​ CronJob 其实就是在 Job 的基础上加上了时间调度,我们可以在给定的时间点运行一个任务,也可以周期性地在给定时间点运行。这个实际上和我们 Linux 中的 crontab 就非常类似了。

​ 一个 CronJob 对象其实就对应中 crontab 文件中的一行,它根据配置的时间格式周期性地运行一个 Job,格式和crontab 也是一样的。

​ 所有 CronJob 的 schedule 时间都是基于 kube-controller-manager 的时区,如果你的控制平面在 Pod 中运行了 kube-controller-manager, 那么为该容器所设置的时区将会决定 CronJob 的控制器所使用的时区。官方并不支持设置如 CRON_TZ 或者 TZ 等变量,这两个变量是用于解析和计算下一个 Job 创建时间所使用的内部库中一个实现细节,不建议在生产集群中使用它。

​ 但是如果在 kube-controller-manager 中启用了 CronJobTimeZone 这个 Feature Gates,那么我们就可以为CronJob 指定一个时区(如果你没有启用该特性门控,或者你使用的是不支持试验性时区功能的 Kubernetes 版本,集群中所有 CronJob 的时区都是未指定的)。启用该特性后,你可以将 spec.timeZone 设置为有效时区名称。

配置清单:

# cronjob-demo.yaml
# 这是一个 CronJob 示例,每分钟执行一次倒计时任务apiVersion: batch/v1
kind: CronJob
metadata:name: cronjob-demo  # CronJob 名称
spec:schedule: "*/1 * * * *"  # cron 表达式:每分钟执行jobTemplate:           # Job 模板spec:template:spec:restartPolicy: OnFailure  # Pod 失败时自动重启,成功则不重启containers:- name: hello          # 容器名称image: busybox       # 使用 busybox 镜像args:- "bin/sh"- "-c"- "for i in 9 8 7 6 5 4 3 2 1; do echo $i; done"# 执行循环命令:从 9 倒数到 1,每个数字打印一行

​ 这里的 Kind 变成了 **CronJob **了,要注意的是 .spec.schedule 字段是必须填写的,用来指定任务运行的周期,格式就和 crontab 一样,另外一个字段是 .spec.jobTemplate , 用来指定需要运行的任务,格式当然和 Job 是一致的。还有一些值得我们关注的字段 .spec.successfulJobsHistoryLimit (默认为 3) 和
.spec.failedJobsHistoryLimit (默认为 1),表示历史限制,是可选的字段,指定可以保留多少完成和失败的Job。然而,当运行一个 CronJob 时,Job 可以很快就堆积很多,所以一般推荐设置这两个字段的值,如果设置限制的值为 0,那么相关类型的 Job 完成后将不会被保留。

​ 验证:

ubuntu@ubuntu:~/example/job_cron_job$ kubectl get jobs
NAME                    STATUS    COMPLETIONS   DURATION   AGE
cronjob-demo-29294269   Running   0/1           0s         0s
ubuntu@ubuntu:~/example/job_cron_job$ kubectl get pods -A
NAMESPACE      NAME                             READY   STATUS      RESTARTS         AGE
default        cronjob-demo-29294283-zkvff      0/1     Completed   0                10s
ubuntu@ubuntu:~/example/job_cron_job$ kubectl logs -f  cronjob-demo-29294283-zkvff
9
8
7
6
5
4
3
2
1
ubuntu@ubuntu:~/example/job_cron_job$ 

不过需要注意的是delete -f xxx.yaml这将会终止正在创建的 Job,但是运行中的 Job 将不会被终止,不会删除 Job 或 它们的 Pod。

那如果我们想要在每个节点上去执行一个 Job 或者 Cronjob 又该怎么来实现呢?

apiVersion: batch/v1
kind: Job
metadata:name: per-node-job  # Job 名称
spec:completions: 3       # 总共需要完成 3 个 Pod 执行成功(对应节点数量)parallelism: 3       # 同时允许 3 个 Pod 并行执行template:spec:containers:- name: taskimage: busybox  # 使用 busybox 镜像执行简单任务command: ["sh", "-c", "echo Hello from $(hostname)"]# 输出当前 Pod 所在节点的主机名restartPolicy: Neveraffinity:nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/hostname  # 节点标签 keyoperator: In               # 节点名在下面的列表中values:- node1                     # 节点1- node2                     # 节点2- node3                     # 节点3
# 解释:
# 1. 通过 nodeAffinity 将 Pod 调度到指定节点
# 2. completions:3 + parallelism:3 保证每个节点一个 Pod 并行运行
# 3. restartPolicy:Never 表示 Pod 执行失败不重启

相关文章:

7. Job与CronJob

Job 与 CronJob 控制器 ​ 接下来给大家介绍另外一类资源对象:Job,我们在日常的工作中经常都会遇到一些需要进行批量数据处理和分析的需求,当然也会有按时间来进行调度的工作,在我们的 Kubernetes 集群中为我们提供了Job 和 CronJob 两种资源对象来应对我们的这种需求。 ​…...

nginx反向代理正则匹配示例及nginx内置变量详解

https://www.cnblogs.com/chenjw-note/p/14388257.html1.匹配url:https://bby.ios.xxx.com:8081/zd?sid=15&key=repx_2530 匹配到sid的值根据sid值进行代理分发 2.达到效果:请求https://bby.ios.xxx.com:8081/xxxx?sid=xxx&xxxxx 根据sid的值转发到对应sid的…...

mt_12

...

完整教程:【QT】-怎么实现瀑布图

完整教程:【QT】-怎么实现瀑布图pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fo…...

【初赛】二叉树性质和遍历 - Slayer

二叉树的性质与遍历 一、二叉树的基本性质 1. 定义 二叉树是每个节点最多有两个子树的树结构,子树分为左子树和右子树,具有顺序性 2. 关键性质性质1:在非空二叉树中,第 \(i\) 层最多有 \(2^{i-1}个\)节点 性质2:深度为k的二叉树最多有 \(2^k - 1\) 个节点 性质3:对任何一…...

详细解析苹果iOS应用上架到App Store的完整步骤与指南

本指南全面讲解了将iOS应用提交到苹果App Store的整个流程,从注册开发者账号开始,到创建App ID和证书、配置应用元数据、打包IPA文件、上传至App Store Connect、进行TestFlight测试、提交审核以及最终发布。每个步骤都提供了详细说明,旨在帮助开发者避免常见错误,高效完成…...

drawio

目录常见问题如何实现一个矩形里添加一个子矩形,拖动时作为整体 常见问题 如何实现一个矩形里添加一个子矩形,拖动时作为整体选中父矩形,快捷键:ctrl + g;...

bootstrap-select插件在webpack中点击无响应

​ 使用插件:https://github.com/snapappointments/bootstrap-select问题:bootstrap-select插件在webpack中点击无响应解决方案: 1、在入口文件中按顺序引入css和js import bootstrap/dist/css/bootstrap.min.css import "bootstrap-select/dist/css/bootstrap-select.…...

Kali 字体大小设置

Kali 字体大小设置 终端字体颜色调整 调整前调整后在session -> 参数配置终端颜色这里可以改自己喜欢的终端颜色在字体这里可以修改字体大小和字体可以选择图片改终端的背景显示和分辨率 在左上角这里选择全部应用程序 选择显示可以修改kali的分辨率和刷新率桌面图标样式和终…...

如何使用 OCR 提取扫描件 PDF 的文本(Python 实现) - E

从 PDF 中提取文本一直是很多人的需求。市面上的工具虽然能处理大部分数字 PDF,但遇到扫描件 PDF 时往往无能为力,想要直接复制或获取其中的文字并不容易。其实这个问题并不是没有解法 —— 本文将带你了解如何借助 Python + OCR 技术,从扫描 PDF 中提取可编辑文本。 为什么…...

重复从网页复制文字到编辑器的Autohotkey自动化代码

为了下某本小说,用feiyuetools录了一段ahk v1的代码,经过阅读与删改之后,得到了以下代码,备忘一下。 原来记录的脚本有很多垃圾代码,必须手工整理与清洁。好在弄好之后,还是很好用的,稳定性不错。 操作:用chrome打开某网站页面,打开notepad4.exe, 开始记录脚本,修改…...

WeakMap 应用场景与示例

WeakMap 是 JavaScript 中一种非常有用的数据结构,它通过弱引用机制来帮助管理内存,防止内存泄漏。简单来说,当你用一个对象作为 WeakMap 的键时,WeakMap 不会阻止这个对象被垃圾回收器回收。一旦这个对象在其他地方没有被引用了,它以及它在 WeakMap 中对应的值就会被自动…...

node,nvm,nrm,npm扫盲

Node相关Node >> 指 Node.js ,Node.js发布于2009年5月,由Ryan Dahl开发,是一个基于Chrome V8引擎的JavaScript运行环境,使用了一个事件驱动、非阻塞式I/O模型, 让JavaScript 运行在服务端的开发平台,它让JavaScript成为与PHP、Python、Perl、Ruby等服务端语言平起…...

使用 conda 懒加载的方式减少 PowerShell 的启动时间

使用 scoop 安装的 miniconda3,在 PowerShell 中进行了 conda init 初始化(注意:不是 Windows PowerShell,见下图,PowerShell 是在 Microsoft Store 中安装的,link)问题:启动速度太慢,大概需要 4 秒 于是进行优化,原理:不要在 profile 里直接运行 conda 的 heavy ho…...

深入 Spring MVC 底层:从 DispatcherServlet 到自定义组件的全链路解析 - 实践

深入 Spring MVC 底层:从 DispatcherServlet 到自定义组件的全链路解析 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "…...

podman 替代docker

podman machine init podman machine start podman machine stop podman machine set --rootless podman machine start--- 她说, 她是仙,她不是神...

202404_古剑山杯_数独

拼图,gapsTags:拼图,gaps 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202404_古剑山杯_数独.zip 0x01. WP 01.解压缩后发现一个image.png类似拼图02.使用工具gaps进行自动拼图 gaps run image.png output.…...

m1芯片装windows系统使用感受

m1芯片装Windows系统使用感受 随着技术的不断进步,苹果公司在其Mac系列电脑中引入了自家设计的M1芯片。这款芯片不仅在性能上有着显著的提升,同时也带来了能效比上的巨大飞跃。然而,对于一些用户来说,macOS可能无法满足他们的所有需求,特别是那些需要运行特定Windows应用程…...

mac book怎么切换windows系统

如何在MacBook上安装并切换Windows系统 一、引言 随着科技的发展和个人需求的多样化,许多人可能会遇到需要在苹果公司的MacBook上运行Windows操作系统的情况。这可能是因为某些特定的应用程序或游戏只能在Windows环境下运行,或者用户希望体验不同操作系统的特色。本篇文章将详…...

硬件内在函数

AVX-512支持:SIMD的终极形态AVX-512支持:SIMD的终极形态// 优化的数值计算// 优化前的代码 public double[] ProcessData(double[] input) {var result = new double[input.Length];for (int i = 0; i < input.Length; i++){result[i] = Math.Sin(input[i]) * Math.Cos(in…...

202205_宁波市赛_DocDocDoc

DOCX,PNG高度隐写,凯撒密码Tags:DOCX,PNG高度隐写,凯撒密码 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202205_第五届市赛_DocDocDoc.zip 0x01. WP解压文件后的到一docx文件,查看内容无明显信息将扩展名…...

DP题

1.区间dp--精妙状态设计与转移 https://codeforces.com/contest/2129/problem/D dp[l][r][a][b]: 表示只考虑放置[l,r]区间内部的数,并且满足所有的s[l]~s[r]的条件,对l-1的贡献是a,对r+1的贡献是b的方案数 转移: 对于dp[l][r][a][b]来说,枚举第一个放置的数,比如说是k,如果k对…...

LGP7115 [NOIP 2020] 移球游戏 学习笔记

LGP7115 [NOIP 2020] 移球游戏 学习笔记 Luogu Link 前言\(\texttt{NOIP2020}\) 笑传之 \(\texttt{Change Content of Balls.in}\)。致敬传奇修改文件选手我也不知道是谁。 题意简述 你面前有 \(n+1\) 根柱子。对于前 \(n\) 个柱子,每根上有 \(m\) 个球,而第 \(n+1\) 根初始是…...

阿里为何建议MVC+Manager层混合架构?

MVC 架构的弊端 Manager 层的特征 Manager 层使用案例传统三层架构代码示 引入 Manager 层后的代码示例初入编程世界时,前辈们总会教导我们,系统设计应遵循 MVC(Model - View - Controller) 架构。MVC 架构就像一个精巧的齿轮组,将整个系统清晰地划分为 Model(模型)、Vi…...

Android(Kotlin)+ ML Kit:移动端英文数字验证码识别实战

1 概述与适用场景 在移动端直接对截图或拍照的英文数字验证码做识别,可以用于自动化测试、无障碍辅助或内部工具。使用 Google ML Kit 的 Text Recognition(可离线运行)可以避免服务端延迟。为了提升识别率,我们在前端加入图像预处理(灰度、二值化、去噪和放大)再送给 OC…...

用Android(Kotlin)+ ML Kit:移动端英文数字验证码识别实战

1 概述与适用场景 在移动端直接对截图或拍照的英文数字验证码做识别,可以用于自动化测试、无障碍辅助或内部工具。使用 Google ML Kit 的 Text Recognition(可离线运行)可以避免服务端延迟。为了提升识别率,我们在前端加入图像预处理(灰度、二值化、去噪和放大)再送给 OC…...

“人工智能+”的坚硬内核,边缘地带的“数字火种”:大模型如何烧出一片新天地

本文由大模型根据作者提问生成,仅修改标题。一场由“失业工程师+过气博主+快烂了的瓜”引发的变革,正悄然重塑中国AI的商业逻辑。如果你只关注科技头条,你会觉得AI的故事属于巨头:万亿参数、军备竞赛、AGI威胁论。但在主流视野之外,真正的革命正在边缘地带发生。这里没有光…...

详细介绍:10:00开始面试,10:06就出来了,问的问题有点变态。。。

详细介绍:10:00开始面试,10:06就出来了,问的问题有点变态。。。pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier Ne…...

PHP启动报错:liboing.so.5:cannot op如何处理?

在 PHP 启动时报错 liboing.so.5: cannot open shared object file: No such file or directory 是因为系统无法找到或加载 liboing.so.5 共享库。这通常是由于以下原因之一导致的:库文件缺失:系统中没有安装 liboing.so.5 文件。 路径未配置:系统未正确配置动态链接库路径。…...

时空倒流 Time - 题解

设 \(x\) 轮为负操作,\(y\) 轮为正操作,\(d\) 为需要修改的差值(正负同理,取正即可),那么可更改成的范围为 \(-x \times R +y*L \sim -x*L+y*R\),令上式为 \(M \sim N\),易得 M 为最小的可能值,N 为最大的可能值,可通过不断给 M 加 1,使 M 变成 N。 综上,枚举 \(x \…...

202508_QQ_XORPNG

Tags:XOR,PNGLSB 0x00. 题目 附件路径:https://pan.baidu.com/s/1GyH7kitkMYywGC9YJeQLJA?pwd=Zmxh#list/path=/CTF附件 附件名称:202508_QQ_XOR&PNG 0x01. WP 01.十六进制编辑器核对 打开发现文件内容并非PNG常见文件头,尝试与常见PNG文件头XOR发现循环的KEY为kelaibe…...

Voice Agent 全球开发者比赛,TEN Dev Challenge 2025 等你来战!

TEN Dev Challenge 2025 全球开发者大赛现已启动,本次赛事聚焦实时交互与对话式AI领域,面向全球开发者开放参与通道。无论您是独立开发者,还是 3 人以内的小型开发团队,均可通过线上形式参与,并有机会角逐总计 1.1 万美元奖金,同时获得行业级展示与合作资源。💰 USD 11…...

第02周 预习:Java基础语法2、面向对象入门 - hohohoho--

第02周 预习:Java基础语法2、面向对象入门项目名称 内容课程名称 java班级 网安2413学生姓名 王璐学号 202421336068预习 1.1 学习目标掌握引用类型及常见类:数组、数组列表(ArrayList)、方法及引用类型作为方法参数 掌握类、对象、方法、属性相关基本概念,对象的初始化。 能…...

第六届机器学习与计算机应用国际学术会议(ICMLCA 2025)

第六届机器学习与计算机应用国际学术会议(ICMLCA 2025) 2025 6th International Conference on Machine Learning and Computer Application(ICMLCA 2025) 第六届机器学习与计算机应用国际学术会议(ICMLCA 2025)定于2025年10月17-19日在中国深圳隆重举行。本届会议将主要关注…...

设计模式-享源模式 - MaC

什么是享元模式? 享元模式是一种结构型设计模式,它通过共享技术来有效地支持大量细粒度的对象。享元模式通过共享已经存在的对象来减少创建对象的数量,从而减少内存占用和提高性能。 享元模式包含以下角色:享元接口(Flyweight):声明一个接口,通过它可以接受并作用于外部状…...

# 数论知识讲解与C++代码:唯一分解定理、辗转相除法、埃氏筛与线性筛(含质因数分解示例)

C++ 模板:唯一分解定理、辗转相除法、埃氏筛与线性筛(含质因数分解示例) 下面给出一套实用的 C++ 模板,包含:辗转相除法(求 gcd / lcm) 试除法的质因数分解(适合小到中等 n) 使用埃氏筛预生成素数(并用于分解) 线性筛(线性时间生成素数,并可得到每个数的最小质因子…...

第九届交通工程与运输系统国际学术会议(ICTETS 2025)

第九届交通工程与运输系统国际学术会议(ICTETS 2025) 2025 9th International Conference on Traffic Engineering and Transportation System (ICTETS 2025) 第九届交通工程与运输系统国际学术会议(ICTETS 2025)将由大连理工大学主办,大连理工大学建设工程学院交通运输系…...

小红书开源 FireRedTTS-2;全栈开源应用+嵌入式+电路设计:BUDDIE AI 语音交互方案丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…...

深度解析 ADC 偶联技术:从随机偶联到定点偶联,如何平衡抗肿瘤 ADC 的活性、稳定性与均一性?

抗体药物偶联物(ADC)作为 “精准抗癌利器”,通过重组单克隆抗体的靶向性与小分子细胞毒性药物的高活性结合,实现了 “靶向递送、精准杀伤” 的治疗理念 —— 既降低了小分子毒素对正常细胞的毒副作用,又提升了肿瘤治疗的疗效,已成为近年来抗肿瘤药物研发的核心赛道。然而…...

豆包P图大更新,网友们已经玩嗨了。

https://news.cnblogs.com/n/800390/最近,大伙有没有感觉互联网被 AI 图片占领了。不是刷到朋友圈的大伙自己搓的手办。。神秘锅哥就是刷到大伙和各路大佬的偶遇合照。。怎么像有人一夜之间给地球开了个创造模式,想创啥就创啥,就我连篇稿都创不出来是吧?关注 AI 圈的差友应…...

【初赛】无向图度数性质 - Slayer

无向图度数性质 一、基础概念:顶点度数定义 在无向图 $ G = (V, E) $ 中:顶点 $ v \in V $ 的度数 $ \deg(v) $ 指关联于该顶点的边的数量 特殊情况:环($ (v, v) $)对 $ \deg(v) $ 贡献 2 孤立点度数为 0 非环边 $ (u, v) $ 对 $ \deg(u) $ 和 $ \deg(v) $ 各贡献 1二、核…...

$p\oplus q=r$

很牛很好的题,但不知道为什么 qoj 这么多踩。 原题/原题 简介题面:问题 A:构造两个长度为 \(n\) 的包含 \(0\sim n-1\) 的排列 \(p,q\),使得 \(r=p\oplus q\) 也是个排列。首先特判 \(n=1\)。然后发现 \(\oplus_{i=0}^{n-1} r_i=\oplus_{i=0}^{n-1} q_i\oplus_{i=0}^{n-1}q…...

2025年金融行业API安全最佳实践:构建纵深防御体系

2025年金融行业API安全最佳实践:构建纵深防御体系金融行业数字化转型深度依赖API技术,开放业务模式也带来新的安全挑战。构建有效的API安全防护体系需覆盖全生命周期,结合管理要求、技术工具和运营机制,并借鉴行业实践案例。提出关键实践方法与实施框架金融行业数字化转型深…...

Jack-of-All-Trades

Jack-of-All-Trades 一、信息收集先使用nmap扫一下Ip看看开放了哪些端口,这里很奇怪,22端口上面却是部署着http协议,看了一下wp这里要使用浏览器绕过这个限制nmap -sS -A -Pn 10.10.196.165 这里使用firefox,在导航栏里面搜索about config然后再出来的搜索框这里再搜索netw…...

Matlab的交通标志定位实现

基于Matlab的交通标志定位实现方案,结合颜色分割、形态学处理和轮廓分析技术一、代码 %% 参数设置 imgPath = traffic_sign.jpg; minArea = 500; % 最小区域面积 maxArea = 10000; % 最大区域面积 colorThreshold = 0.8; % 颜色相似度阈值%% 图像预处理 img = imread(imgP…...

怎样在 Salesforce Flow 中获取当前 Salesforce 组织的 URL

可以在 Flow 中配置一个 Formula 类型的变量: LEFT($Api.Partner_Server_URL_260, FIND( /services, $Api.Partner_Server_URL_260))...

reLeetCode 热题 100-3 最长连续序列扩展 排序算法 - MKT

reLeetCode 热题 100-3 最长连续序列扩展 排序算法...

vuejs3.0 从入门到精通【左扬精讲】—— 从原生到原子化:一文梳理现代 CSS 技术体系(2025 版)

vuejs3.0 从入门到精通【左扬精讲】—— 从原生到原子化:一文梳理现代 CSS 技术体系(2025 版)作为前端开发的核心技术之一,CSS(层叠样式表)早已不是 “写几行样式” 那么简单。随着项目规模扩大和工程化需求升级,CSS 技术栈也衍生出众多分支 —— 从解决复用性的预处理器…...

java中JSON字符串处理的踩坑

在处理JSON字符串的时候,读取的数据原封不动每一行是,前后有两个引号"{\"cuidC54E92418CA1CD099A5AFC4D2F322015|VECB5VMT4\": {\"REFINED_APPLIST_TIMESTAMP\": 1756716480, \"DEVICE_INFO\": {\"SOURCE\": 131072, \"br…...

11111

1111111111...