来思考几种场景:
1.某个脚本需要执行时间比较长,无人值守,可能执行过程因ssh会话超时而中断? 2.某次测试一段代码,需要临时被放入后台运行? 3.已经调起作业后,发现没有将作业放入到后台执行,如何补救? 4.需要在后台运行大量脚本,如何管理?
解决思路:
当终端关闭或网络断开后,当前终端中运行的进程就会收到SIGHUP(终止信号),终端关闭,终端进程下的所有子进程也会关闭。为此,我们可以考虑: (1)有没有方法让运行中的进程不再收到SIGHUP信号 (2)有没有方法让运行中的进程独立存在,不属于当前终端的子进程
方法:
1. & :让命令后台运行
sh test.sh >test.log& --‘&’将命令放入后台执行
2. nohup:让提交的命令忽略hangup(挂起)信号
例如:test.sh 为执行的脚本,test.log为输出信息的地方
nohup sh test.sh >>test.log --标准输出和标准错误缺省会被重定向到test.log中
注意: (1)该命令如果需要和用户交互,就不能放在后台执行,因为这样命令会卡在交互的地方。 (2)使用“&”命令后,作业被提交到后台运行,当前终端/控制台没有被占用,但是一旦把当前终端关掉(退出当前帐号时),提交的作业就会被停止运行,而nohup命令可以在退出账号后继续运行相应的进程
3. disown
如果我们已经提交的命令未加任何处理,如果补救才能让它避免Hangup信号的影响呢,这时想加nohup为时已晚,只能通过作业调度和disown来解决这个问题
disown -h :使某个作业忽略Hangup信号
disown -ah :使所有作业都忽略Hangup信号
disown -rh :使运行的作业忽略Hangup信号
|