脚本后台运行linux
背景 :工作需要,需要远程控制主机使其断开Xshell后也能一直运行。
关键字 :& ,nohup,脚本挂起。
在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行。
键入Ctrl + C,发出SIGINT信号,程序会继续运行
方法一、输入命令:jobs
方法二:输入命令:ps
fg、bg、jobs、&、nohup、ctrl+z、ctrl+c 命令
加在一个命令的最后,可以把这个命令放到后台执行,如
可以将一个正在前台执行的命令放到后台,并且处于暂停状态。
查看当前有多少在后台运行的命令
jobs -l选项可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。
将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用fg %jobnumber(是命令编号,不是进程号)将选中的命令调出。
将一个在后台暂停的命令,变成在后台继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出。
法子1:通过jobs命令查看job号(假设为num),然后执行kill %num
法子2:通过ps命令查看job的进程号(PID,假设为pid),然后执行kill pid
前台进程的终止:Ctrl+c
如果让程序始终在后台执行,即使关闭当前的终端也执行(之前的&做不到),这时候需要nohup。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。
关闭中断后,在另一个终端jobs已经无法看到后台跑得程序了,此时利用ps(进程查看命令)
如上所示:
nohup 和 & 组合了后台运行程序。
可以输出到 out.log保存程序输出,也可以输出到/dev/null 即空设备,不保存输出。
上面三种方式无论在nohup.out 或test.out都看不到数据结果,这是因为python执行有缓存输出
解决
新的接口接入查看程序
使用&后台运行程序:
结果会输出到终端
使用Ctrl + C发送SIGINT信号, 程序免疫
关闭session发送SIGHUP信号, 程序关闭
使用nohup运行程序:
结果默认会输出到nohup.out
使用Ctrl + C发送SIGINT信号, 程序关闭
关闭session发送SIGHUP信号, 程序免疫
平日线上经常使用nohup和&配合来启动程序:
同时免疫SIGINT和SIGHUP信号
同时,还有一个最佳实践:
不要将信息输出到终端标准输出,标准错误输出,而要用日志组件将信息记录到日志里
nohup和&究竟有啥区别
2. linux怎么开机启动脚本并在后台运行
这种后台运行,你要允许,然后它运行就好了。
3. linux开机自动执行命令和脚本 自动启动 自启 进程一直运行
原文及更新: https://neucrack.com/p/91
直接在/etc/rc.local(/etc/rc.d/rc.local)文件中添加即可
上面这脚本实际上在使用时出现了问题, /home/neucrack/software/ss/start_ss_local.sh 这个命令始终没有被执行,原因是 /home/neucrack/software/ss/start_kcptun_client.sh 中的命令阻塞了进程,导致后面一句始终没有执行,可以将他们分别放到后台执行就行了,如何在后台执行可以看文章最后一部分
也可以自己手动在rc*.d中建立软连接
桌面系统搜索 启动 ,打开启动管理器 添加删除即可
一般有以下几种方法:
1)在输入命令的最前面加上 nohup 命令
如 nohup your_command & 这样命令在你退出后仍然会在后台执行
2) setsid 命令
setsid your_command 该命令的结果是使你所运行的命令的父进程为init,所以只有关机该进程才会停止
3) (your_command &)
就是用括号将你的命令括起来,这样做也是使命令的父进程为init
4) disown
当你在命令行下输入 your_command & 后命令就在后台执行了,然后执行jobs命令,该命令会列出当前正在后台执行的命令。例如输入命令“top&”
然后执行"jobs"
输出结果是
[1] + Suspended (tty output) top
注意行开头方括号内的数字,该数字叫做jobspec,是给当前后台运行的job的编号。这是你只要在命令行下输入"disown -h 1" 后台运行的top命令就不会受到hangup信号的影响了。
5)使用 screen 命令
在命令行下输入screen命令就开启了一个screen进程,它就好像是一个全新的命令运行环境,在该环境中你可以像在正常的terminal下那样执行
命令,但是这个screen是不受其父进程的hangup信号的影响的,既然screen不受其父进程影响,当你意外掉线或者退出系统时,在screen
中仍在执行的命令仍然会继续执行。关于screen命令的使用方法你可以再去查阅相关资料。
4. 如何让Linux的脚本关闭终端后继续执行
加& 是不行的。
因为不管是后台还是前台,都是terminal 的子进程。terminal一关,父进程在推出前,会杀掉所有的子进程。
Linux 里有一些工具,可以脱钩父子进程。比如screen,ubuntu/debian用apt安装。
apt-getinstallscreen
用法:在terminal里打
screen
然后运行你的程序。
再按
ctrl +a, ctrl +d.
就脱钩了。可以关terminal了。
想挂钩,用
screen-r
如果有多个脱钩进程,比如
:
8881.pts-0.Jordan(Detached)
8494.pts-0.Jordan(Detached)
用
screen-r[pid]
比如
screen-r8881
5. 每天三分钟搞定linux shell脚本24 后台模式运行
当运行脚本的时候在最后加上符号 & ,则对应的脚本在 后台运行 。建立脚本为,
输入 ./test.sh & 运行
运行后1.txt文件会不断增加内容,但是脚本以后台运行不会在终端占用。运行结果为:
输入 jobs 可以看到这个后台进程:
这个时候如果输入exit,不会提示有后台进程在运行,而且后台进程也会退出。因为终端会话退出的时候会给这个后台进程发送一个 SIGHUP信号 。如果想要终端退出之后,进程不退出,可以让进程捕获SIGHUP信号。当然还有另一个方法,使用 nohup 指令运行脚本,比如输入:
当用 nohup 并使用后台模式运行之后,即使退出终端,进程也不会收到SIGHUP信号。并且nohup会自动把标准输出和标准错误重定向到nohup.out的文件中。
一个 运行的进程或者暂停的进程 都是一个作业,使用 jobs 命令可以查看当前的作业状态。输入:
我当前的输出为:
(上面的作业2是输入 ctrl+z 后暂停的进程)
其中, + 号被当作是默认作业,每个作业的前面有自己的序号。如果后续操作不加序号,那么就被当做是在操作默认作业。比如使用 fg 指令前台运行作业,就是把27652这个进程前台运行,如果输入 fg 1 ,那么就是操作作业 1 了。带-号的表示下一个默认作业。
输入 bg 1 把 1号作业 后台运行,输入 fg 2 把 2号作业 前台运行。
6. linux脚本中,如何等待后台进程(之前用&放到后台)结束再执行后面的命令
用wait
比如下面的例子, cmd1 放入后台运行, 而cmd2 要等 cmd1结束后才会执行。
#!/bin/bash
cmd1 &
wait
cmd2
7. 在linux下怎么让一个脚本定时运行
Linux中,周期执行的任务一般由cron这个守护进程来处理 ps -ef | grep cron
cron读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。
cron的配置文件称为“crontab”,是“cron table”的简写。
8. 写了一个perl脚本,怎么让它在linux后台运行
运行时ctrl+z暂停程序
jobs -l 查看暂停程序的序号号
bg %jobnumber 将一个在后台暂停的命令,变成继续执行
如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
9. linux环境下 脚本前台执行没有问题,后台执行 就会stopped。
后台进程如果需要输入东西的话,就会进入stopped状态。nohup是忽略所有的挂断信号,保证后台进程不间断的执行。
10. 在Linux中如何让脚本在后台运行
在执行脚本的最后加上&
或者将脚本写到cron job中