linux注销后,后台脚本[不会]销毁?!

kabin 发布于 2015/01/08 09:29
阅读 680
收藏 0
我是linux初学者,正在学习程序管理这一章,使用的是centos 6.X。
我上网下了个shell脚本,后台执行他 [./xx.sh &] ,然后退出登录,我用其他账号ps查看发现这个脚本仍然在执行 !?

而且这个脚本的PID由原来正常的PID变成了 1。

PS:使用nohup来执行和上面描述的情况一样!



问题是:

我【没有用nohup】等其他命令,为什么退出登录脚本还在继续执行?!

user注销后,后台程序理应被关闭;但实验中却没有?!这是为什么?我想知道原因

而且我试过[top &]这样,注销后它会正常退出的!

脚本:
#!/bin/bash
date
while [0]
sleep 1
do
date

done

顺道请教一下,怎么让[已经执行的程序]即使user注销/终端断开也能继续运行?

应该不是Ctrl+z吧,这个只是挂起,即使使用bg也只是放到后台。

以下是问题补充:

@kabin:这么多的回答基本都是不看问题的。。。。中国的问答网站貌似都这样 (2015/01/08 11:03)
加载中
0
buglife
buglife
制作成系统服务
buglife
buglife
回复 @kabin : 注销只是一个退出登录状态 ,也不应该带这些操作吧,也许你可以写个脚本在完成注销的时候关闭你想关闭的程序
k
kabin
我的问题是,user注销后,后台程序理应被关闭;但实验中却没有?!这是为什么?我想知道原因。
0
sami
sami
web server 用户注销了 然后把这个用户的 httpd 关了?
k
kabin
怎么感觉你说的和我问题不是同一件事情。。。。
0
renwofei423
renwofei423
linux中 “&” 和“nohup”都是后台执行某程序的意思,即使你注销或者退出登录,仍然会运行,除非你kill掉此进程。
k
kabin
而且我试过[top &]这样,注销后它会正常退出的! 请看看问题,你有试过么?
k
kabin
但是各大书籍都说使用&,注销后会会被结束,因为是该用户bash的子程序。。。。你的观点比较奇怪
0
亭舸翁
亭舸翁

简单来说

后边不加 & ,term关闭后程序会退出

后边加&,用exit退出term。程序还可以继续执行

0
renwofei423
renwofei423

user注销后,后台程序理应被关闭;但实验中却没有?!这是为什么?我想知道原因” 这是windows的做法吧,或者个人理解是图形终端的做法。windows中后台程序不是真后台成为一个服务/后台进程,只是前端图形隐藏了而已。

linux某个脚本或程序没有后台运行(比如加入“&” 或“nohup”,又或创建后台进程),那么在其执行终端(不管是图形终端,还是命令行终端)退出后,进程也会结束。

k
kabin
你可以man nohup看看
k
kabin
nohup是专门用于user断开后,程序仍然可以执行的命令。。。-_-~!汗 因为用户注销前,他的所有子程序都会收到SIGHUP信号,而停止程序;而nohup是让该程序忽略这个信号!
0
renwofei423
renwofei423
另外 [top &] 是个特殊情况。
k
kabin
为什么呢?
0
eechen
eechen
ping `hostname` 在用户退出终端(exit)时,终端会收到hup(hangup)信号从而关闭其所有子进程(比如这里的ping).
nohup的用途就是让提交的命令忽略hangup信号.
nohup的使用是十分方便的,只需在要处理的命令前加上nohup即可,标准输出和标准错误默认被重定向到nohup.out文件中.
一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名.
nohup ping `hostname` & 标准输出和标准错误默认被重定向到nohup.out
nohup ping `hostname` >ping.log 2>&1 & 标准输出和标准错误默认被重定向到ping.log
nohup ping `hostname` >/dev/null 2>&1 & 标准输出和标准错误默认被重定向到/dev/null(其实就是丢弃输出)
ps -ef |grep ping 退出(exit)运行ping的终端,仍然可以看到ping在运行.
kill `pidof ping` 退出程序.
k
kabin
为什么每个人都答非所问。。。无语了~~! 我【没有】用nohup,为什么注销后还可以运行?
0
eechen
eechen

引用来自“eechen”的评论

ping `hostname` 在用户退出终端(exit)时,终端会收到hup(hangup)信号从而关闭其所有子进程(比如这里的ping).
nohup的用途就是让提交的命令忽略hangup信号.
nohup的使用是十分方便的,只需在要处理的命令前加上nohup即可,标准输出和标准错误默认被重定向到nohup.out文件中.
一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名.
nohup ping `hostname` & 标准输出和标准错误默认被重定向到nohup.out
nohup ping `hostname` >ping.log 2>&1 & 标准输出和标准错误默认被重定向到ping.log
nohup ping `hostname` >/dev/null 2>&1 & 标准输出和标准错误默认被重定向到/dev/null(其实就是丢弃输出)
ps -ef |grep ping 退出(exit)运行ping的终端,仍然可以看到ping在运行.
kill `pidof ping` 退出程序.
sleep 3600 &
执行exit退出终端,则sleep继续运行.
直接关闭终端,则sleep立即退出.
nohup sleep 3600 &
无论何种方式退出终端,sleep都会继续在后台运行.
k
kabin
是的,也就是说,&程序注销后是否会被关闭,貌似要看程序的类型;这个真没了解
0
甘薯
甘薯

nohup 和&不一样的.

nohup肯定不会被注销掉.&这种东西好像是看情况. 

我感觉和脚本的类型有关系, 看执行的是什么操作, 申请的是那种资源, 因为操作系统不是实时检查客户端退出的.

如果脚本是实时申请资源或者操作系统调度的那么会很快退出, 如果是半沉睡那种, 应该不会马上退出的.

甘薯
甘薯
回复 @kabin : :) 貌似确实是这样的.你不说我还真想不起来总结这个规律...
k
kabin
是的,也就是说,&程序注销后是否会被关闭,貌似要看程序的类型;这个真没了解
返回顶部
顶部