${BASH_SOURCE[0]} , $0,$1,$2...记录一下

${BASH_SOURCE[0]}表示bash脚本的第一个参数(如果第一个参数是bash,表明这是要执行bash脚本,这时"${BASH_SOURCE[0]}"自动转换为第二个参数),例如:

bash modules/tools/planning_traj_plot/run.sh

"${BASH_SOURCE[0]}"代表的是modules/tools/planning_traj_plot/run.sh。
"dirname"表示提取参数里的目录,dirname "${BASH_SOURCE[0]}"表示提取bash脚本第一个参数里的目录,例如modules/tools/planning_traj_plot/run.sh”的目录为"modules/tools/planning_traj_plot。

$0 表示文件名,$1 表示shell的第一个参数,$2 表示shell的第二个参数。。。
#!/bin/bash echo "--------------------------------------------------------" printf "set variable ...\n" package_ip=172.22.126.50 get_path=/home/mdbs/MDBS/MDBS_V5.0.5/x86_64/zip #get_path=/home/mdbs/MDBS/MDBS_V5.0.4P04/x86_64/zip password="wvu7G55U2025" install_path=/home/MDBS_V5.0.6 #install_path=/home/MDBS_V5.0.4p04 deploy_log=/root/deploy.log ntp_ip=172.17.251.101 get_req_node_ip=192.168.6.71 node_password="mdbs-123" mount_path=/home/autest PYTHONPATH=$mount_path/hci/hci_python log_path=/root/mdbs_test.log printf "package_ip: %s\n" $package_ip printf "get_path: %s\n" $get_path printf "install_path: %s\n" $install_path printf "deploy_log: %s\n" $deploy_log printf "ntp_ip:%s\n" $ntp_ip printf "get_req_node_ip:%s\n" $get_req_node_ip printf "node_password:%s\n" $node_password printf "PYTHONPATH:%s\n" $PYTHONPATH printf "log_path:%s\n" $log_path sleep 10 printf "\n" echo "--------------------------------------------------------" printf "get package ...\n" ssh root@$get_req_node_ip "rm $install_path/MDBS_V* -rf" ssh root@$get_req_node_ip "sshpass -p $password scp root@$package_ip:$get_path/MD5.txt $install_path/" ssh root@$get_req_node_ip "sshpass -p $password scp root@$package_ip:$get_path/MDBS_V* $install_path/" rpm_md5=$(ssh root@$get_req_node_ip "cd $install_path; md5sum MDBS*") ssh root@$get_req_node_ip "cat $install_path/MD5.txt | grep '$rpm_md5'" if [ $? -ne 0 ]; then printf "rpm MD5 not same with MD5 txt!\n" exit 1 fi printf "\n" echo "--------------------------------------------------------" printf "deploy mdbs ...\n" ssh root@$get_req_node_ip "cd $install_path;sh install_mdbs.sh" > $deploy_log 2>&1 cat $deploy_log | grep "PLAY RECAP" -A 4 | grep "localhost" -B 3 | grep "failed=1" if [ $? -eq 0 ]; then printf "deploy mdbs rpm failed!\n" exit 1 fi ssh root@$get_req_node_ip -t "cd $install_path;sh recover_isolate_rebuild_ttl.sh; sh set_mgt_port.sh" printf "\n" echo "--------------------------------------------------------" printf "reset env ...\n" ntpdate -s $ntp_ip rm -f $log_path rm -rf /opt/macrosan/mdbs/config/* mkdir -p /opt/macrosan/mdbs/config/openssl sshpass -p $node_password scp root@$get_req_node_ip:/opt/macrosan/mdbs/config/openssl/* /opt/macrosan/mdbs/config/openssl/ sh cp_test_code.sh printf "\n" echo "--------------------------------------------------------" printf "run test ...\n" source /opt/macrosan/mdbs/py_env/bin/activate export PYTHONPATH=$PYTHONPATH nosetests $mount_path/hci/hci_test/script/tools/test.py >> $log_path 2>&1 printf "\n" echo "--------------------------------------------------------" printf "get result ...\n" python /root/get_test_result.py $log_path cp $log_path $mount_path 上述是shell脚本yr_test1.sh的内容,执行命令sh yr_test1.sh &,为什么在执行到ssh root@$get_req_node_ip "cd $install_path;sh install_mdbs.sh" > $deploy_log 2>&1后,[root@localhost ~]# ps -axu | grep test root 849261 0.0 0.0 22776 3812 pts/1 T 17:31 0:00 sh yr_test1.sh
最新发布
05-14
### 背景分析 在Linux环境中,后台运行的Shell脚本可能会因为某些条件而进入暂停(T状态)。这种现象通常与信号处理机制有关。具体来说,在执行`ssh`命令时,如果未正确配置TTY或标准输入/输出流,则可能导致子进程被挂起。 以下是可能的原因及其解决方案: #### 原因一:伪终端分配问题 当通过`ssh`连接远程主机并执行命令时,默认情况下,如果没有指定选项禁用伪终端分配 (`-t`) 或者显式启用无交互模式 (`-n`),则可能出现TTY相关的问题[^1]。这会导致本地Shell等待用户输入,从而使得父进程处于暂停状态 (T)。 ```bash ssh -n root@$get_req_node_ip "cd $install_path; sh install_mdbs.sh" >$deploy_log 2>&1 & ``` 此修改利用了 `-n` 参数来重定向 `stdin` 到 `/dev/null` ,防止 SSH 尝试读取来自控制台的数据[^2]。 --- #### 原因二:管道操作中的阻塞行为 另一个常见原因是由于 I/O 缓冲区满或者下游消费者未能及时消耗数据造成的阻塞。例如,如果 `$deploy_log` 文件写入速度较慢,那么整个流水线将会停滞直到缓冲区清空为止[^3]。 为了缓解这种情况可以考虑增加日志轮转策略或将输出直接丢弃至黑洞设备: ```bash ssh root@$get_req_node_ip "cd $install_path; sh install_mdbs.sh >/dev/null 2>&1" ``` 这样既避免了不必要的磁盘 IO 开销又减少了潜在的死锁风险. --- #### 原因三:Job Control 的影响 默认情形下, Bash 启用了 job control 功能. 当某个前台作业接收到 SIGSTOP 信号后便会转变为停止态(T). 如果当前 shell 是 interactive mode 下启动的话即使将其放入 background 执行也有可能受到该特性的影响[^4]. 可以通过设置环境变量 CLOEXEC 来改变这一状况: ```bash nohup ssh root@$get_req_node_ip "cd $install_path; sh install_mdbs.sh" >$deploy_log 2>&1 & ``` 这里使用 nohup 工具屏蔽 SIGHUP 信号的同时还关闭了继承自父进程的标准描述符文件句柄[^5], 进一步增强了稳定性. --- ### 综合建议 综合以上几点因素, 推荐采用如下改进后的版本: ```bash setsid ssh -o StrictHostKeyChecking=no -n root@$get_req_node_ip \ "cd '$install_path'; ./install_mdbs.sh </dev/null >/dev/null 2>/tmp/install.err.log" & disown %1 ``` 其中: - 使用 setsid 创建新的 session group 隔离父子关系. - 添加严格密钥验证选项 (-o). - 显式声明 null 输入源以及错误记录位置. - disown 移除关联以便完全脱离当前 terminal 控制. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值