主Shell脚本结束后如何维持内部Shell脚本运行?附脚本问题排查
问题分析与解决
你遇到的问题根源在于exec命令的特性:exec会用新启动的进程替换当前的shell进程,而不是在子进程中运行它。所以当你执行exec /u/team/infiloop.sh ...时,你的终端shell直接被infiloop.sh替换了,这就导致终端被无限循环的进程占据,无法输入其他命令;按下Ctrl+C时,终止的就是这个infiloop进程,自然它就停了。
解决方案:后台运行目标进程
把exec去掉,改成后台运行的方式,同时可以结合disown让进程脱离终端控制,避免终端关闭时进程被终止。
修改后的test.sh脚本如下:
#!/bin/bash if pgrep infiloop > /dev/null ; then echo "Process is running." else # 后台运行进程,同时重定向标准错误到输出文件 /u/team/infiloop.sh > /u/team/infiloopOutput.txt 2>&1 & # 让进程脱离当前shell控制,终端关闭后仍能继续运行 disown echo "Process was not running, started it in background." fi
关键修改点说明:
- 移除
exec:让infiloop.sh作为当前shell的子进程启动,而非替换当前shell - 末尾添加
&:将进程放到后台运行,释放终端供你执行其他命令 2>&1:把标准错误输出也重定向到同一个文件(可选,用于捕获进程的错误信息)disown:让后台进程脱离当前shell的管理,即使关闭终端,进程也不会被终止(可选,根据你的实际需求决定是否添加)
验证效果
运行修改后的test.sh后,你会立刻看到提示信息,终端也能正常输入其他命令。可以用pgrep infiloop或者ps aux | grep infiloop确认进程是否在后台运行;如果需要终止进程,直接执行pkill infiloop即可。
内容的提问来源于stack exchange,提问作者Thinker
相关产品推荐
相关产品推荐

