如何在同一脚本中为多进程配置独立sleep命令并同时运行?
在单个脚本中并行运行带独立sleep的进程
我懂你想要的效果——在同一个脚本里让多个进程各自按自己的时间间隔输出内容,之前拆分到子脚本调用没搞定,现在想用while循环来实现对吧?其实核心是要让这些进程并行后台运行,而不是串行执行,我给你一个实用的示例脚本,再拆解下关键要点:
示例脚本
#!/bin/bash # 定义进程A的逻辑:每X秒输出一次 run_process_a() { local interval=5 # 这里替换成你需要的X秒 while true; do # 输出内容可以自定义,这里加上时间方便看效果 echo "$(date '+%Y-%m-%d %H:%M:%S'): 这是进程A的输出内容" sleep $interval done } # 定义进程B的逻辑:每Y秒输出一次 run_process_b() { local interval=10 # 这里替换成你需要的Y秒 while true; do echo "$(date '+%Y-%m-%d %H:%M:%S'): 这是进程B的输出内容" sleep $interval done } # 关键:把两个进程放到后台并行运行 run_process_a & run_process_b & # 让主脚本等待所有后台进程结束(不加的话主脚本会直接退出,后台进程仍会继续运行) wait
关键说明
后台运行的核心:
&符号
之前用子脚本调用没达到预期,大概率是因为你没加&——如果直接调用子脚本,主脚本会等第一个子脚本执行完(包括它的sleep)才会启动第二个,变成了串行执行。而加&后,进程会被放到后台运行,主脚本会立刻继续执行下一行,这样两个进程就能同时跑起来,各自的sleep互不影响。用函数封装逻辑更清晰
把每个进程的循环和sleep逻辑封装成函数,比写一堆零散的代码更易读、易维护,你还可以轻松扩展出进程C、D之类的。可选的
wait命令
最后加wait是让主脚本一直挂着,直到所有后台进程结束(比如你手动终止脚本)。如果不需要主脚本保持运行,也可以去掉wait——这时候主脚本执行完就退出,但后台的两个进程会继续在系统里运行,直到你手动杀掉它们。
额外小技巧
- 如果不想两个进程的输出混在一起,可以把输出重定向到不同的日志文件:
run_process_a > process_a.log 2>&1 & run_process_b > process_b.log 2>&1 & - 要停止这些进程的话,可以用
pkill -f 你的脚本文件名,或者在启动脚本时记下后台进程的PID(比如run_process_a & echo $! > pid_a.txt),之后用kill $(cat pid_a.txt)来单独终止某个进程。
内容的提问来源于stack exchange,提问作者TDias
相关产品推荐
相关产品推荐

