linux 后台运行一个sh,不占用当前shell
简单说明
一般来说你希望在后台运行一个shell脚本。
方法一:
nohup 命令 + &。
方法二:
(./abc &)
nohup 在最后不加 & 的时候仅仅是实现了屏蔽到关闭会话带来的中断。
仅仅使用 & 的时候,实现了屏蔽< C+c>信号,但是关闭当前会话,也会使程序停止下来。
同时使用 nohup 和 最后加 & 即可实现,既屏蔽关闭会话带来的中断 又屏蔽< C+c>带来的中断。
关闭会话会给程序一个SIGHUP的中断信号。
< C+c>会给程序一个SIGINT的中断信号。
测试方法
编写一个测试程序,一个窗口运行.
一个窗口用下面的命令查看
ps -aux | grep abc
注意:
-aux 显示所有包含其他使用者的行程
-a显示的不全,本测试中要用-aux
编写一个测试程序
abc.cpp
#include<stdio.h>
#include<unistd.h>
int main()
{
int t=15;
for(int i=0;i<t;i++)
{
printf("%d\n", i);
sleep(1);
}
return 0;
}
编译
gcc abc.cpp -o abc
测试仅仅使用 nohup,末尾不加 &
amazing@ubuntu:~/c++/test$ nohup ./1
nohup: ignoring input and appending output to 'nohup.out'
^C
amazing@ubuntu:~/c++/test$
关闭会话不好记录,这里就不记录了,下面直接给出结论
结论:
< C+c>可以中断程序
关闭当前会话无法中断程序
测试仅仅使用 &
运行
amazing@ubuntu:~/c++/test$ ./abc &
[1] 19893
amazing@ubuntu:~/c++/test$ 0
1
2
3
^C
amazing@ubuntu:~/c++/test$ 4
5
6
7
8
9
10
11
12
13
14
结论
< C+c> 无法中断程序
关闭当前会话可以中断程序。
测试使用 nohup 并在结尾加上 &
amazing@ubuntu:~/c++/test$ nohup ./abc &
[1] 20022
amazing@ubuntu:~/c++/test$ nohup: ignoring input and appending output to 'nohup.out'
^C
amazing@ubuntu:~/c++/test$
< C+c>
amazing@ubuntu:~/c++/test$ ps -aux | grep abc
amazing 19983 0.0 0.0 2496 576 pts/1 S 01:14 0:00 ./abc
amazing 19987 0.0 0.0 17540 736 pts/2 S+ 01:14 0:00 grep --color=auto abc
关闭会话
amazing@ubuntu:~/c++/test$ ps -aux | grep abc
amazing 19983 0.0 0.0 2496 576 ? S 01:14 0:00 ./abc
amazing 19989 0.0 0.0 17540 668 pts/2 S+ 01:14 0:00 grep --color=auto abc
结论
< C+c> 无法中断程序
关闭当前会话无法中断程序。
测试 (./abc &)
amazing@ubuntu:~/c++/test$ (./abc &)
amazing@ubuntu:~/c++/test$ 0
1
^C
amazing@ubuntu:~/c++/test$ 2
3
4
5
6
关闭会话
amazing@ubuntu:~/c++/test$ ps -aux | grep abc
amazing 20040 0.0 0.0 2496 588 ? S 01:17 0:00 ./abc
amazing 20048 0.0 0.0 17540 672 pts/2 S+ 01:18 0:00 grep --color=auto abc
结论
< C+c> 无法中断程序
关闭当前会话无法中断程序。
Linux nohup 命令
Linux 命令大全 Linux 命令大全
nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。
使用权限
所有使用者
语法格式
nohup Command [ Arg … ] [ & ]
参数说明:
Command:要执行的命令。
Arg:一些参数,可以指定输出文件。
&:让命令在后台执行,终端退出后命令仍旧执行。
实例
以下命令在后台执行 root 目录下的 runoob.sh 脚本:
nohup /root/runoob.sh &
在终端如果看到以下输出说明运行成功:
appending output to nohup.out
这时我们打开 root 目录 可以看到生成了 nohup.out 文件。
如果要停止运行,你需要使用以下命令查找到 nohup 运行脚本到 PID,然后使用 kill 命令来删除:
ps -aux | grep "runoob.sh"
参数说明:
a : 显示所有程序
u : 以用户为主的格式来显示
x : 显示所有程序,不区分终端机
另外也可以使用 ps -def | grep "runoob.sh" 命令来查找。
找到 PID 后,就可以使用 kill PID 来删除。
kill -9 进程号PID
以下命令在后台执行 root 目录下的 runoob.sh 脚本,并重定向输入到 runoob.log 文件:
nohup /root/runoob.sh > runoob.log 2>&1 &
2>&1 解释:
将标准错误 2 重定向到标准输出 &1 ,标准输出 &1 再被重定向输入到 runoob.log 文件中。
0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出)
2 – stderr (standard error,标准错误输出)