关于linux后台运行进程如何屏蔽ctrl+z

近日遇到shell后台启动进程,输入ctrl+z被挂起的问题

具体描述如下:

1、现有两个shell脚本,grandfather.sh和father.sh,两个C++程序son1和son2,其中son1为普通程序,son2使用occi连接oracle数据库

调用关系为

2、Father.sh启动son1和son2后,退出到Grandfather.sh,此时在Grandfather.sh中安ctrl+z后,使用ps aux查看son1和son2的进程状态分别为T和S

3、个人认为,既然Father.sh在后台启动son1和son2,那么son1和son2就不应该再受前台shell的影响,不再接收前台shell的信号,更何况Father.sh已经退出了,son1和son2的父进程PID已经为1了。但其实,Grandfather.sh与son1和son2还存在继承关系,共用一些资源和信号,导致son1和son2会收到ctrl+z信号,从而son1被挂起,此时kill掉Grandfather.sh后,son1正常,说明son1与Grandfather.sh确实还有关联。

4、对于son2,为何没被挂起呢?原因是occi会捕获ctrl+z等信号,所以表面上son2没有收到影响,但实际上可能connection已经回滚或出错了。

5、解决方法分为两种,一是在c++程序中屏蔽信号,二是在shell脚本中屏蔽信号

6、在c++程序中屏蔽ctrl+z等信号

    //signum为信号的数字表示,其中SIGSTOP=ctrl+c,SIGTSTP=ctrl+z
    int32_t signum;
    //callback为信号响应时的回调函数
    SignalCallback callback;
    struct sigaction act, oldact;
    memset(&act, 0, sizeof(act));
    memset(&oldact, 0, sizeof(oldact));
    sigemptyset(&act.sa_mask);
    act.sa_handler = callback;
    return sigaction(signum, &act, &oldact);

但occi会优先于c++程序捕获信号,所以此方法对son2程序不起作用

7、在shell脚本中屏蔽ctrl+z等信号

trap exit SIGUSR2
trap exit SIGUSR1
trap exit SIGTERM
trap exit SIGSTOP
trap exit SIGTTIN
trap exit SIGTSTP
trap exit SIGTTIN
trap exit SIGTTOU
trap exit SIGCHLD
trap exit SIGINT

trap命令需要两个参数,第二个参数为信号的编号,第一个参数为收到信号时,要替换成的动作,若只是屏蔽信号,则可将第一个参数设为‘’

关于后台运行的原理,请参考文章 http://www.cnblogs.com/SuperXJ/archive/2011/10/31/2230314.html

时间: 2024-10-20 17:52:17

关于linux后台运行进程如何屏蔽ctrl+z的相关文章

linux 后台运行进程 fg bg ctrl+z

fg.bg.jobs.&.nohup.ctrl+z.ctrl+c 命令 一.& 加在一个命令的最后,可以把这个命令放到后台执行,如 watch -n 10 sh test.sh & #每10s在后台执行一次test.sh脚本 二.ctrl + z 可以将一个正在前台执行的命令放到后台,并且处于暂停状态. 三.jobs 查看当前有多少在后台运行的命令 jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated.但是如果任务被

Linux后台运行

有两种方式: 1. command & : 后台运行,你关掉终端会停止运行2. nohup command & : 后台运行,你关掉终端也会继续运行 一. 简介 Linux/Unix 区别于微软平台最大的优点就是真正的多用户,多任务.因此在任务管理上也有别具特色的管理思想.我们知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让程序在前台后台之间切换.而 Linux 提供了 fg 和bg 命令,让你轻松调度正在运行的任务.假设你发现前台运行的

linux后台运行&符号、nohup命令、输出重定向等使用方法

列出若干种情形,便于这几个命令及参数的理解: 在命令最后加上&符号,表示让这个进程到后台去执行,这样立刻返回到提示符状态,我们可以接着做下面的事.如:command & 但此时如果这个进程有输出,还是会显示出来,这又会干扰到我们的shell窗口.所以可以考虑把标准输出重定向到某个文件去,如:command >output & 现在清净了.但有时我们会发现后台运行的进程出错了,我们希望把错误信息也保存起来.那就用到了linux中默认定义两个变量:1指标准输出:2指错误输出,所以

让程序在linux后台运行的方法

常见用法: nohup ./Thriftc & > /dev/null & 在linux后台运行Thriftc程序,并将其输出重定向到空设备:/dev/null,也就是将程序输出全部丢弃. nohup COMMAND > out.log 2>&1 & 在linux后台运行COMMAND命令,将标准输出重定向到out.log文件,标准错误也重定向到out.log文件(标准错误重定向到标准输出,再将标准输出重定向到out.log). 上边的示例涉及到两个命令:

linux中bg、fg、ctrl+z、ctrl+d和ctrl+c的区别

fg.bg.jobs.&.ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 $ pct & 二.ctrl + z 可以将一个正在前台执行的命令挂起三.jobs 查看当前有多少在后台运行的命令 jobs命令执行的结果,+(加号)表示是一个当前的作业,- (减号)表示是一个当前作业之后的一个作业,jobs -l选项可显示所有任务的PID. jobs的状态可以是runn

linux 后台运行nohup & ctrl+z

使用Linux时,经常希望有些命令结果不在前台显示,如sh脚本,耗时的命令等.一般情况下,使用 & 将命令结果后台运行,如sh test.sh,脚本后台执行. 有时候命令已经在前台执行了,需要将其切换到后台可以使用, ctrl+z ,但是该命令切换到后台会处于暂停状态,可以配合 jobs 进一步处理后台的命令(进程). 更极端的情况是 有些命令需要占用很长的时间却又不能间断,如下载...,这时候需要 nohup (ignoring hangup signals) 忽略挂起信号一直在后台执行. 比

linux如何后台运行进程,而且不随终端关闭而关闭

参考:http://www.cnblogs.com/kaituorensheng/p/3980334.html 使用命令nohup:no hang up,表示关闭终端后,进程并不随着终端关闭而关闭 fg.bg.jobs.&.nohup.ctrl+z.ctrl+c 命令 一.& 加在一个命令的最后,可以把这个命令放到后台执行,如 watch -n 10 sh test.sh & #每10s在后台执行一次test.sh脚本 二.ctrl + z 可以将一个正在前台执行的命令放到后台,并

linux如何后台运行进程

linux直接运行某个进程,在当前命令结束后,或者关闭掉shell窗口该进程会结束. 如何在后台运行某个进程 方法1 使用nohup命令,nohup命令本身的意思是no hung up表示不会收到shell的关闭,关闭掉进程. 使用nohup command &使得命令可以在后台运行,通过job -l可以看到后台运行的情况. 这里比较坑的地方是如果直接关闭掉shell,shell也会关闭掉这个后台的命令,退出shell需要先通过命令 exit然后在关闭才能在后台运行 方法2 利用脚本在后台运行,

linux中mongodb在后台运行进程

# 方法1:(推荐)# --fork 选项将会通知 mongod 在后台运行/path/to/MongoDB_Dir/bin/mongod --logpath /path/to/file.log --logappend --fork # 方法2:# 将输出重定向到 file.log 文件# & 将该进程置于后台运行/path/to/MongoDB_Dir/bin/mongod >> /path/to/file.log & # 还可以这样运行(不记录日志)# 因为所有重定向到位桶