首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么从bash脚本调用timeout程序会导致tcsetattr挂起?

从bash脚本调用timeout程序会导致tcsetattr挂起的原因是timeout程序在执行时会创建一个子进程,并使用exec函数来执行指定的命令。而在执行exec函数时,子进程会继承父进程的终端属性,包括终端的输入模式、输出模式等。当timeout程序执行exec函数时,会调用tcsetattr函数来设置终端的属性,以确保执行命令时终端的输入输出正常。

然而,由于bash脚本本身也会使用tcsetattr函数来设置终端的属性,当timeout程序执行exec函数时,会导致tcsetattr函数被调用两次,其中一次是在timeout程序中执行的,另一次是在bash脚本中执行的。这样就会导致竞争条件,使得tcsetattr函数挂起,从而导致bash脚本调用timeout程序时出现问题。

为了解决这个问题,可以在bash脚本中使用重定向来避免timeout程序继承父进程的终端属性。具体做法是将timeout程序的输出重定向到/dev/null,例如:

timeout -s SIGKILL 10s command > /dev/null

这样timeout程序就不会继承父进程的终端属性,避免了tcsetattr挂起的问题。

推荐的腾讯云相关产品:腾讯云函数(Serverless Cloud Function),它是一种无服务器计算服务,可以帮助开发者在云端运行代码,无需关心服务器的管理和维护。腾讯云函数支持多种编程语言,包括Node.js、Python、Java等,可以通过事件触发来执行代码,非常适合处理一些需要定时执行或触发执行的任务。腾讯云函数的产品介绍链接地址:https://cloud.tencent.com/product/scf

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Unix-Linux编程实践教程-chapter06-signal

第6章 为用户编程:终端控制和信号 有些程序处理特定设备来的数据.这些与特定设备相关的程序 必须控制与设备的链接.Unix系统中最常见的设备是终端 终端驱动程序有很多设置.各个设置的特定值决定了终端驱动程序的模式...为用户编写的程序通常需要设置终端驱动程序为特定的模式 键盘输入分为三类,终端驱动程序对这些输入做不同的处理.大多数键 代表常规数据,他们驱动程序传输到程序,有些键调用驱动程序中的编辑 函数.如果按下删除键...,驱动程序将前一个字符他的行缓冲中删除,并将 命令发送到终端屏幕,使之显示器中删除字符.最后,有些键调用处理 控制函数.Ctrl-C键告诉驱动程序调用内核中某个函数,这个函数给进程 发送一个信号.终端驱动程序支持若干种处理控制函数...set tty into no-delay mode * read char, return result * returns: 0 => yes, 1 => no, 2=> timeout...&= ~ECHO; // no echo either ttystate.c_cc[VMIN] = 1; // get one char at a time tcsetattr

1.1K10

故障分析 | 有效解决 MySQL 行锁等待超时问题【建议收藏】

程序中非数据库交互操作导致事务挂起 将接口调用或者文件操作等这一类非数据库交互操作嵌入在 SQL 事务代码之中,那么整个事务很有可能因此挂起(接口不通等待超时或是上传下载大附件)。 2....磁盘问题导致的事务挂起 极少出现的情形,比如存储突然离线,SQL 执行会卡在内核调用磁盘的步骤上,一直等待,事务无法提交。...这里也解释了很多开发经常问我的,为什么 SELECT 也阻塞其他会话? 如果遇到这种情况,那么处理其实非常简单。...上述这个问题模拟,其实就是对应第三节问题产生原因中的第二点(事务中包含性能较差的查询 SQL),下面我们把第一点(程序中非数据库交互操作导致事务挂起)也模拟下,对比下现象。... DBA 的角度看,这类现象八成就可以断定是代码在事务中嵌入了其他的交互操作导致的事务挂起(另外也有可能是网络问题导致的事务僵死),因为程序并不像人,它不会偷懒,不会出现事务执行到一半,休息一再提交一说

3K20

linux 后台运行进程:& , nohup

nohup就是不挂起的意思( no hang up / ignoring hangup signals) 即 忽略挂起信号一直在后台执行。...,这时候断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown,起不到关掉终端后调用程序继续后台运行的作用。...思考 问题1-为什么ssh一关闭,程序就不再运行了 元凶:SIGHUP 信号 让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。...http://blog.csdn.net/hmsiwtv/article/details/7901711 ) 结论:因此当网络断开或终端窗口关闭后,也就是SSH断开以后,控制进程收到SIGHUP信号退出,导致该会话期内其他进程退出...简而言之:就是ssh 打开以后,bash等都是他的子程序,一旦ssh关闭,系统将所有相关进程杀掉!!

4.3K40

HTTP2 504 Gateway Timeout 36369ms

解释如下: 最近在工作中,需要做Excel导入的功能,由于Excel的数据比较多,而且我们的服务端程序需要对数据的内容做校验,会调用很多的外部服务接口,所以毫无悬念的导入Excel接口调用超过了一分钟,...由之前的0s改为60s,这样php-cgi进程 处理脚本的超时时间就是60秒,可以防止进程都被挂起,提高利用效率。...最关键的是php-fpm.conf的设置,这个直接导致502 Bad Gateway和504 Gateway Time-out。...由于我的服务器PHP脚本需要长时间运行,有的可能超过10分钟因此我设置了900秒,这样不会导致PHP-CGI死掉而出现502 Bad gateway这个错误。...回答二: 一般bai看来, 这种情况可能是由于nginx默认的fastcgi进程响应的缓冲du区太小造成的zhi, 这将导致fastcgi进程被挂起, 如果你的fastcgi服务对这dao个挂起处理的不好

9310

MYSQL千万级别数据量迁移Elasticsearch5.6.1实战

官方下载压缩包,解压即可使用,解压后有两个目录(bin/lib),脚本存放在bin目录,下面有示例脚本供参考。安装过程参考官方文档。.../bin/sh DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" bin=${DIR}/../bin lib=${DIR}/.....,执行此脚本,查看数据是否mysql中写入elasticsearch索引库中。...建议以后台挂起的方式执行任务,防止连接中断导致任务中断。 若对目标索引有特殊要求,比如某些字段不进行analyze等,可提前建立好索引及映射机制,再使用脚本进行数据导入工作。...limit参数不宜调试过大,容易导致timeout的情况发生,近而导致任务中断,执行失败。 脚本运行建议以后台挂起的形式运行,防止因连接中断导致任务中断。

66330

解决paramiko执行命令超时的问题

=10,get_pty=True) 其实上面的两种方案都不可行:方案1,需要优化,下面这种直接调用的方式导致test.sh启动不起来 stdin, stdout, stderr = self.client.exec_command...(‘sh ~/test.sh &’,get_pty=True) 方案2,对于需要等待很久的命令,如果timeout小于程序的执行时间,还是失败,命令执行失败 最终的解决方案来自参考1 把执行很久的...摘录原文: paramiko远程执行后台脚本“阻塞”问题 我写的远程命令通道上线之后,发现在远程脚本中后台再执行另一个脚本,通道一直等待后台脚本执行完成才会返回,有时甚至僵死。...1、复现过程如下: ①、编写测试脚本 脚本1:test.sh #!/bin/bash sleep 30 echo test end exit 0 脚本2:run.sh #!...其实原因很简单,因为bash /tmp/test.sh & 虽然是后台执行,但是依然产生标准输出,一旦产生标准输出,paramiko就会认为命令还未执行完成,且stdout的buffer大于stderr

3.6K20

深度剖析MySQL慢更新问题

由于问题复现的不确定性,因此在线上实例写脚本抓现场:当问题出现时,记录下innodb引擎状态(show innodb status)、用户线程状态,innodb引擎状态信息中存在死锁信息。...lock_wait_suspend_thread函数让所有调用线程进入suspend状态,挂起。...lock_wait_timeout_thread是锁超时监测线程,监测是否有线程等锁超时,该线程扫描每一个由lock_wait_suspend_thread进入等待的线程,判断其是否超时,如果有超时,...每增加n个进入等待进程,其中的每一个进程都会触发一次lock_wait_timeout_thread,而每一次lock_wait_timeout_thread调用都会对m个已经挂起线程持锁扫描,这样多出...lock_wait_suspend_thread 对lock_wait_timeout_thread的调用,是用来加速监测锁超时等待的,去掉该调用,减少大压力并发的热点行更新对lock_wait_timeout_thread

2.7K32

面试官:什么是 EventLoop。你:一脸蒙蔽。看完这篇文章就懂了

例如,当引擎正忙于执行 script,用户可能移动鼠标 mousemove,这 setTimeout 可能是由于任务到期而导致的,等等,这些任务形成了一个队列,如上图所示。...它甚至可能导致浏览器“打ic”甚至“挂起”一小段时间,这是不可接受的。 通过将大任务分成多个部分,我们可以避免问题。...为了证明这种方法,为简单起见,而不是文本的高亮显示,让我们一个函数,计算1到1000000000。 如果您运行下面的代码,引擎将“挂起”一段时间。...为什么? 这很简单:您记得,许多嵌套 setTimeout 调用在浏览器中的最小延迟为4ms 。即使我们设置了0,它4ms(或者更多)。因此,我们计划得越早–运行速度越快。...code 首先显示,因为它是常规的同步调用。 promise显示第二个,因为它.then通过微任务队列,并在当前代码之后运行。 timeout 最后显示,因为它是一个宏任务。

1.1K30

linux 后台运行方法总结

.&), screen, tmux 问题现象 远程登录服务器时常需要长时间运行任务,由于网络不稳定或logout等因素造成连接断开,导致前台任务运行中断。...为什么 该现象与SIGHUP信号有关 在POSIX-compliant平台(Solaris,MacOS 等)[1]上,当终端logout时,该终端下所有进程会收到SIGHUP信号 在Android, FreeBSD...另,使用 disown %1 也可达到相同效果,不过当前任务任务列表移除,但仍可以通过ps查看进程 Tips: 在我们的日常工作中,我们可以用 Ctrl z 来将当前进程挂起到后台暂停运行,执行一些别的操作...,然后再用 fg 来将挂起的进程重新放回前台(也可用 bg 来将挂起的进程放在后台)继续运行。...那如果终端本身解决问题,即,使终端不关闭呢?那就是 screen、 tmux了!

3.7K20

Java 并发编程之美-线程相关的基础知识

其实程序计数器就是为了记录该线程让出 CPU 时候的执行地址,待再次分配到时间片时候就可以自己私有的计数器指定地址继续执行了。...wait() 方法后该线程会被挂起,同时该线程暂时释放对该共享变量监视器的持有,直到另外一个线程调用了共享变量的 notify() 或者 notifyAll() 方法才有可能重新获取到该共享变量的监视器的持有权...void wait(long timeout) 方法 该方法相比 wait() 方法多一个超时参数,不同在于如果一个线程调用了共享对象的该方法挂起后,如果没有在指定的 timeout ms 时间内被其它线程调用该共享变量的...需要注意的是如果在调用该函数时候 timeout 传递了负数抛出 IllegalArgumentException 异常。...(timeout); } void notify() 方法 一个线程调用共享对象的 notify() 方法后,唤醒一个在该共享变量上调用 wait 系列方法后被挂起的线程,一个共享变量上可能会有多个线程在等待

65030

MHA故障failover执行不成功的背后的大坑

以上通过ps 抓取出来的进程列表显示,进程很长的时间内,都没有变化(一直挂起)。细心的同学已经观察到,前后2次的抓取的进程列表的最大的差别是: 所有的进程S状态变成了T状态。...这个要跟masterha_manager进程调用脚本的流程说起: 由于MHA是Perl编写的,加上有点基础,所以很快就找到相关的MHA进程创建相关的关键调用关系: masterha_manager 脚本...,masterha_manager进程调用第三方scripts的时候,使用的是system() 来调用(本身还是以beforeground的方式fork进程+sh 第三方脚本方式), 所以所有的进程全部继承终端...以下是用shell脚本重现的例子: [root@10_174_129_85_nginx ~]# cat g.sh #!/bin/bash ..../g.sh [root@10_174_129_85_nginx ~]# 解决办法: 后端脚本中禁止使用终端,例如ssh去掉 -t选项(不调用读或者写 终端的命令/系统调用) 在程序运行前,修改终端属性:

52920

node系列:环境配置和介绍

如何安装node 可以官网直接下载或者使用brew或者wget下载工具进行下载,但是更加推荐nvm管理和安装我们的node,此处我们就来介绍nvm来管理我们的node 什么nvm?...此安装脚本 nvm repo clone 到 ~/.nvm,并且将 source line 新增至你的 profile 设定 ( ~/.bash_profile、~/.zshrc、~/.profile...在最初设计时设计成了单线程,为什么不是多线程呢?...换句话说当一个异步过程调用发出后,调用者不会立刻得到结果,而是调用发出后,被调用者通过状态、通知或回调函数处理这个调用 阻塞与非阻塞 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态....阻塞调用是指调用结果返回之前,当前线程会被挂起调用线程只有在得到结果之后才会返回。 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

67810

进程组、会话、控制终端概念,如何创建守护进程?

启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。 复制代码 Systemd 就是为了解决这些问题而诞生的。...登录后的第一个进程叫做会话领头进程(session leader),通常是一个shell/bash。对于会话领头进程,其PID=SID。 控制终端 一个会话一般拥有一个控制终端用于执行IO操作。...例如登陆shell(例如bash)通过调用int tcsetpgrp(int fd, pid_t pgrp); 函数设置为某个进程组pgrp关联终端设备fd,该函数执行成功后,该进程组pgrp成为前台进程组...复制代码 那么,在创建守护进程时为什么调用setsid()函数呢? 读者可以回忆一下创建守护进程的第一步,在那里调用了fork()函数来创建子进程再令父进程退出。...这些被打开的文件可能永远不会被守护进程读或写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法被卸载。

1.3K20

Event Loop

一、为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊。...JavaScript语言的设计者意识到,这时主线程完全可以不管IO设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下去。...四、Event Loop 主线程"任务队列"中读取事件,这个过程是循环不断的,所以整个的这种运行机制又称为Event Loop(事件循环)。...(1)V8引擎解析JavaScript脚本。 (2)解析后的代码,调用Node API。 (3)libuv库负责Node API的执行。...实际上,这种情况只发生在递归调用的时候。

1.4K70

【Linux】Linux进程的理解 --- 冯诺依曼体系、进程描述符、状态、优先级、切换…

如果我向我的好友发送消息,硬件结构来看,前提应该是我们各自都打开了QQ程序,并将QQ这个程序加载到了内存里面,CPU执行QQ程序的代码,我就可以通过代码里面的scanf或cin等语句的执行,利用键盘发送消息...等等消息,这些消息数据会由输入设备键盘加载到内存中的QQ程序里面,然后CPU对这些消息做出处理,将处理后的结果返回给内存里面,然后这些消息内存进一步加载到外部设备网卡和显示器等里面,我的朋友的笔记本的输入设备网卡接收这些消息...6.系统调用和库函数的区别(上下层关系) 1. 在开发角度,操作系统对外表现为一个整体,但是暴露自己的部分接口,供上层开发使用,这部分由操作系统提供的接口,叫做系统调用接口。 2....下面便可以看到父进程id始终不变,我的代码对应的进程id因为程序的多次运行而变化,并且我的进程的父进程是bash,所以我们可以得出结论:命令行上启动的进程,一般它的父进程没有特殊情况的话,都是bash...阻塞进程过多时,操作系统会将一些进程挂起,以此来解决内存空间不足的问题,如果挂起依旧无法解决内存空间不足,Linux就会将进程杀死,但是一旦杀死进程很有可能导致进程对应的IO过程失败,从而丢失大量数据,

1.1K20

linux shell指令大全整理

/test.sh 变量类型 局部变量 在脚本中定义, 仅在当前shell中有效, 其他shell不能访问 环境变量 所有程序, 包括shell启动的程序, 都能访问环境变量, 在c中通过system()...done while循环 这边用了两个括号后, 就可以<=号进行判断了, 不知道为什么, 而且还是连着的 而且用了let命令,let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上...' ] then echo "you input y break" break else echo "you input other" fi done 函数 参数和调用脚本一样...):stdin的文件描述符为0,Unix程序默认stdin读取数据。...标准错误文件(stderr):stderr的文件描述符为2,Unix程序向stderr流中写入错误信息。

1.6K50
领券