修复“正确操作nohup让程序始终在后台运行”中已发现的问题

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dgd2010.blog.51cto.com/1539422/1406629

问题:“抚琴煮酒”(余洪春)在《构建高可用Linux服务器(第二版)》的第119页中写到“产生此问题的原因是:虽然Shell中提示了nohup成功,但还是需要按键盘上的任意键退回到Shell输入命令窗口,然后通过在Shell中输入exit来退出终端,而不是每次在nohup执行成功后直接关闭终端。”

解决办法:使用登录shell防止终端关闭而导致进行自动退出的情况。我常用的命令行为:su -l -c "nohup /some/command.sh >/dev/null 2>&1 &" 。

PS:Red Hat/CentOS启动时在后台运行用户命令,可在/etc/rc.local文件中添加如下行:su -l -c "nohup /some/command.sh >/dev/null 2>&1 &"。

解释:

(1)su -lc表示以登录shell(-l)执行(-c)命令;

(2)经过脚本测试nohup 后面跟着的>/dev/null 2>&1只对nohup本身有作用,即很难使用nohup向/some/command.sh 传递参数,这一点还没有找到相关的资料。

什么是登录shell:(1)用户登陆时,输入用户名和密码后启动的shell;(2)通过带--login参数的命令:bash --login而启动的shell,对于用户来说,登陆shell和非登陆shell的主要区别是:启动shell时所执行的startup文件不同。非登陆shell执行的startup文件仅为:~/.bashrc,而登陆shell执行startup文件为:/etc/profile、~/.bash_profile、~/.bashrc。

什么是非登录shell:除了以上两种情况生成的用户对话,如直接运行bash命令,su某一个用户等。

什么是交互shell:一般的用户与Linux系统用命令行进行操作时使用的shell都为交互式shell。

什么是非交互shell:但执行脚本时,shell就工作在非交互式模式下,因为shell从第一条命令执行到最后一条然后退出,不与用户进行任何交互。

以上四个定义可以参阅以下链接:

linux下的bash与sh 详解以及例子

登录shell,交互式非登录shell,非交互式shell

什么是交互式登录 Shell

书中原文:

“我的Nginx负载均衡器监控Nginx进程的脚本nginx_pid需要放入后台不间断地运行,所以想用命令/bin/sh/data/nginx_pidsh &来达到此目的,在输入完命令后我就关闭了终端,可再次登录终端时发现此程序并没有运行。忽然想起可能是因为没有使用nohup命令,试了试,果然如此,带上nohup命令后就正常了。   
我们的很多程序只是普通的程序,即使它们使用&结尾,如果终端关闭,那么程序也会被关闭。为了能够在后台运行,我们需要使用nohup这个命令,原程序的标准输出被自动改到当前目录下的nohupout文件里,起到了log的作用。    
但是有时候这样做会有问题:如果把终端关闭,进程也会被自动关闭。查看nohupout可以看到在关闭终端的瞬间服务自动关闭了。    
产生此问题的原因是:虽然Shell中提示了nohup成功,但还是需要按键盘上的任意键退回到Shell输入命令窗口,然后通过在Shell中输入exit来退出终端,而不是每次在nohup执行成功后直接关闭终端。    
这个错误许多朋友(包括我)容易忽视,希望大家在工作中注意。”

扩充:

在nohup的手册中有一段话需要认真体会“If standard  input is a terminal, redirect it from /dev/null.  If standard output is a terminal, append output to ‘nohup.out’ if possible, ‘$HOME/nohup.out’ otherwise.  If standard error is a terminal, redirect it to standard output.  To save output to FILE, use ‘nohup COMMAND > FILE’.”。

什么是标准输入?什么是标准输出?什么是标准错误输出?这些问题都比较回答。可以参阅以下链接:

linux shell数据重定向(输入重定向与输出重定向)详细分析

Linux shell的标准输入、输出和错误

但“哪些操作或设备被认为是标准输入,哪些操作或设备被认为是标准输出”这两个问题不怎么好回答。从上面那段话可以看出终端既是一种标准输入设备又是一种标准输出设备(文字中提到的“终端”我认为只是用户的字符界面样式的屏幕而已。)。根据我的理解标准输入只能来自用户的输入(input)操作,可以认为所有的输入设备都是标准的输入,标准输出对应所有的输出设备如屏幕打印机等,重定向只是将不同的标准输入输出从这些寻常的途径变为用户指定了的途径罢了(改变了标准输入输出)。

本文出自 “通信,我的最爱” 博客,请务必保留此出处http://dgd2010.blog.51cto.com/1539422/1406629

时间: 2024-09-10 04:58:55

修复“正确操作nohup让程序始终在后台运行”中已发现的问题的相关文章

使用nohup让程序在远程主机后台运行

因为我购买的一个国外主机居然开放了Telnet权限,因此我也使用Telnet登录上去玩玩Linux,但发现一关闭窗口就自动和主机断开了,和Windows的终端不一样,所以就上网找啊找,找到了一个从后台一直运行某个程序的方法. Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/mysqld_safe –user=mysql & 但是加入我们很多程序并不象mysqld一

windows8.1系统中开始界面的程序改为后台运行?

1. 在windows 8.1系统启动时我们会看到如下开始界面了,那么要如何让它转入后台运行: 2. 如果没有进入UI(开始)界面,使用键盘左下角徽标键或者鼠标放在屏幕右上角或者右下角后点击开始按钮,即可恢复到UI(开始)界面: 3. 如下红圈处我们打开一个运行的程序: 4. 然后我们鼠标移到中间会看到有一个小手了,我们操作它: 5. 现在我们按住鼠标左键,然后我们拖支左边,如下图所示: 6. 这样开始菜单就在后台运行了,如果你让它显示出来我们只要点击那小缩略图就可以了哦.

如何安装或如何修复和重新安装Office 2003 程序和功能

可使用本节中的信息来安装或者修复和重新安装 Office 2003 中的个别功能. 操作步骤: 如何安装 Office 2003 中的个别功能 通常情况下,当您第一次尝试使用尚未安装的功能时,Office 2003 会自动安装该功能.例如,如果您在 Microsoft Office Excel 2003 中指向"数据"菜单上的"获取外部数据",然后单击"运行数据库查询",则 Microsoft Query 会自动安装. 如果 Office 200

stm32 ds1302-stm32对ds1302的操作怎么写程序

问题描述 stm32对ds1302的操作怎么写程序 要做一个关于时钟的小系统,用stm32做主控芯片,之前用的是51不知道现在该怎么写程序,希望有大神能帮帮忙帮帮忙 解决方案 stm8及DS1302的一些操作 解决方案二: 最简单但很笨的做法是IO模拟,但实际上STM32本身有SPI,IIC总线,故可直接使用固件函数库直接操作你的RTC寄存器

求大神看看,C语言二叉树非递归遍历问题 ,最后输出正确,然后在程序崩溃

问题描述 求大神看看,C语言二叉树非递归遍历问题 ,最后输出正确,然后在程序崩溃 #include #include #include typedef struct TNode { char date; struct TNode *lchild,*rchild; }TNode,*BiTree; typedef struct { BiTree top; BiTree *base; int stacksize; }Stack; int createBiTree(BiTree &S){ char ch

【Linux&Unix】使用nohup让程序永远后台运行

Unix/Linux下一般比如想让某个程序在后台运行,很多都是使用 & 在程序结尾来让程序自动运行.比如我们要运行mysql在后台: /usr/local/mysql/bin/mysqld_safe --user=mysql & 但是加入我们很多程序并不象mysqld一样做成守护进程,可能我们的程序只是普通程序而已,一般这种程序使用 & 结尾,但是如果终端关闭,那么程序也会被关闭.但是为了能够后台运行,那么我们就可以使用nohup这个命令,比如我们有个test.php需要在后台运行

事件-如何监控操作文件的程序呢

问题描述 如何监控操作文件的程序呢 我们知道,监控文件的创建是 一件很容易的事情.在.NET中,通过FileSystemWatcher就可以 监控到文件的操作. 但是,我希望在监控文件的创建.删除等事件的同时,知道是哪些程序在做这些操作. 这 又如 何做到呢? 解决方案 参考Using C#, how does one figure out what process locked a file? 因为你现在已经获得了文件信息,所以需要通过文件查询相关进程,上面链接的回复里有代码可以实现. 另外也

任务管理器-MFC程序,程序在运行中一切良好,如果长时间不进行程序操作,程序就卡死了

问题描述 MFC程序,程序在运行中一切良好,如果长时间不进行程序操作,程序就卡死了 写的MFC程序,程序在运行中一切良好,如果长时间不进行程序操作,程序就卡死了,最小化到托盘后,界面也显示不出来了,不知道是怎么回事?还有通过任务管理器看内存情况,内存也没有 明显的增加,也不占CPU,有谁遇到过这样的事情呢?帮帮忙了,谢谢了! 解决方案 可能存在隐藏较深的.或随机发生.或者在一定条件下发生的指针操作越界. 内存也没有 明显的增加,是不是说明内存在不操作下还是有增加,特别是 GDI 等.这样,有可能

java 字符串 报错-java程序在eclipse运行正确,在牛客网测试界面运行报错

问题描述 java程序在eclipse运行正确,在牛客网测试界面运行报错 在eclipse可以正常运行,在牛客网的测试里报错:"运行错误:请检查是否存在数组越界非法访问,野指针乱访问,空指针乱访问等情况." 题目:连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组: ?长度不是8整数倍的字符串请在后面补数字0,空字符串不处理. 输入例子: abc 123456789 输出例子: abc00000 12345678 90000000 import java.util.Sca