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,标准错误输出)
文章目录