循环嵌套导致的,fork炸弹
原理:就是通过不断地创建子进程导致系统不再接受外部指令,从而导致机器宕机
-----fork炸弹实现
function fork(){ fork | fork& };fork
1.执行:
[master@model:~]$function fork(){ fork | fork& };fork
[1] 1649
2.不一会会打印出如下结果:
-bash: fork: retry: 没有子进程
-bash: fork: retry: 没有子进程
-bash: fork: retry: 资源暂时不可用
-bash: fork: retry: 没有子进程
-bash: fork: retry: 没有子进程
-bash: fork: retry: 没有子进程
3.因为master用户下有进程限制,所以不会宕机,因为root用户下会没有限制,会导致宕机
4.应对方法:再非root用户下有ulimit命令查看最大的进程限制
[root@model:~]$ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7258
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 7258
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
捕获信号得使用场景:比如我们有个程序在进行备份,那么很怕被中断,这个时候我们就可以使用信号捕获防止被中断了。
捕获信号后,信号
#!/bin/bash
echo $$ # 打印当前的进程得pid
trap 'echo 151515 $$' 15 # 捕获15信号 kill默认的
trap 'echo 222 $$' 2 # 捕获ctrl+c 默认的信号
trap 'echo 222 $$' 4 # 捕获信号4
while :
do
:
done
------1.安装
yun install at
------2.启动服务
[root@model:/home/master]$/bin/systemctl start atd.service
[root@model:/home/master]$/bin/systemctl status atd.service
● atd.service - Job spooling tools
Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
Active: active (running) since 三 2023-12-13 21:45:47 CST; 26s ago
Main PID: 13949 (atd)
CGroup: /system.slice/atd.service
└─13949 /usr/sbin/atd -f
12月 13 21:45:47 model systemd[1]: Started Job spooling tools.
12月 13 21:46:00 model atd[13956]: Starting job 2 (a0000201b0...
Hint: Some lines were ellipsized, use -l to show in full.
------3.制定定时任务
[root@model:/home/master]$at 21:48
at> echo hello > /home/master/trap.log
at> <EOT>
job 3 at Wed Dec 13 21:48:00 2023
------4.然后按住ctrl+D进行保存退出
------5.atq 查看任务列表
[root@model:/home/master]$atq
1 Thu Dec 14 21:44:00 2023 a root
----------------------------------------------
atq展示如下信息:
作业编号(Job ID):在这种情况下,作业编号为 1。
执行时间:任务预定在 Thu Dec 14 21:44:00 2023 执行。
用户:任务由 root 用户预定。
----------------------------------------------
周期性任务 cron
配置方式
crontab -e
查看现有的计划任务
crontab -l
配置格式
实际操作
-1.每分钟都运行一次
* * * * * /usr/bin/data >> /tmp/date.log
-2.每天凌晨3点:注意这里的分钟不要使用* 而是0表示整点
0 3 * * * /usr/bin/data >> /tmp/date.log
-3.每周1,3,5 每分钟执行
* * * * 1,3,5 /usr/bin/data >> /tmp/date.log
-4.每周1,3,5 每分钟执行
* * * * 1,3,5 /usr/bin/data >> /tmp/date.log
-4.12月6号得5点以及 12月的周1、3、5的凌晨5点执行
0 5 6 12 1,3,5 /usr/bin/data >> /tmp/date.log
-4.每5小时执行一次
0 */5 * * * /usr/bin/data >> /tmp/date.log
要查看相关的日志可以进入
[root@model:~]$tail -f /var/log/cron
Dec 13 20:01:01 model run-parts(/etc/cron.hourly)[13226]: starting 0anacron
Dec 13 21:58:01 model CROND[14107]: (root) CMD (/usr/bin/date >> /tmp/date.log)
Dec 13 21:59:02 model CROND[14116]: (root) CMD (/usr/bin/date >> /tmp/date.log)
场景
实现方案
flock -xn
是一个用于文件锁定的命令,其中 -xn
是 flock
命令的两个参数。
-x
参数表示使用独占锁(exclusive lock)。独占锁意味着只有一个进程可以获取到该锁,并且其他进程在获取锁之前会被阻塞。-n
参数表示非阻塞模式(non-blocking)。非阻塞模式下,如果无法获取到锁,flock
命令不会阻塞当前进程,而是立即返回一个错误。1.执行命令时使用flock
[root@model:/tmp]$flock -xn "/tmp/f.lock" -c 'bash /tmp/test.sh'
2.再次执行的时候也要使用flock进行执行才可以,也必须要使用flock这个命令
[root@model:/tmp]$flock -xn "/tmp/f.lock" -c 'bash /tmp/test.sh'