Bash脚本后台运行含while循环的脚本出现异常问题求解
问题原因分析
- 首先明确两种调用方式的本质差异:
source "${scripts_path}/scripts/poll.sh" &写法会创建主脚本的子shell进程,在这个子shell内逐行执行poll.sh的代码,不会启动独立的新shell进程。这种写法本身就违背了source命令的设计目的:source的核心作用是在当前shell进程执行脚本,共享当前shell的变量环境,放到后台子进程运行后,子进程的所有变量修改都无法同步回主脚本,完全没有使用source的必要。- 改为直接执行
"${scripts_path}/scripts/poll.sh" &时,系统会根据poll.sh头部的shebang启动独立的全新bash进程运行脚本,会继承主脚本export导出的环境变量,完全符合你的需求。
- 导致source后台运行卡住的核心原因是终端作业控制规则:后台运行的进程如果属于前台进程组,一旦尝试访问控制终端(包括读取标准输入、修改终端配置等操作),系统会自动发送
SIGTTIN/SIGTTOU信号将其暂停。你通过source运行的poll.sh子shell继承了主脚本的终端控制属性,curl运行时的隐性标准输入检查触发了该规则,导致进程被暂停,因此只能看到第一次循环的输出,后续代码完全不会执行。 - 独立启动的poll.sh进程会自动完成终端访问的隔离,不会触发上述暂停信号,因此可以正常循环执行。
内容的提问来源于stack exchange,提问作者unsafe_where_true
相关产品推荐
相关产品推荐

