shell_67.Linux以后台模式运行脚本

以后台模式运行脚本
1.直接在命令行界面运行 shell 脚本有时不怎么方便。有些脚本可能要执行很长一段时间,而你不想在命令行界面一直干等。
但脚本运行不完,就不能在终端会话中执行任何其他操作。幸好有一种简单的方法可以解决这个问题。
使用 ps -e 命令,可以看到 Linux 系统中运行的多个进程:

$ ps -e 
 PID TTY TIME CMD 
 1 ? 00:00:02 systemd 
 2 ? 00:00:00 kthreadd 
 3 ? 00:00:00 rcu_gp 
 4 ? 00:00:00 rcu_par_gp 
[...] 
 2585 pts/0 00:00:00 ps 
$ 

后台运行脚本
以后台模式运行 shell 脚本非常简单,只需在脚本名后面加上&即可:

$ cat backgroundscript.sh 
#!/bin/bash 
#Test running in the background 
# 
count=1 
while [ $count -le 5 ] 
do 
    sleep 1 
    count=$[ $count + 1 ] 
done 
# 
exit 
$ 
$ ./backgroundscript.sh & 
[1] 2595    #[1]作业号    2595进程id
$ 


当后台进程结束时,终端上会显示一条消息:

[1]+ Done ./backgroundscript.sh 


其中指明了作业号、作业状态(Done),以及用于启动该作业的命令(删除了&)。
注意,当后台进程运行时,它仍然会使用终端显示器来显示 STDOUT 和 STDERR 消息:

$ cat backgroundoutput.sh 
#!/bin/bash 
#Test running in the background 
# 
echo "Starting the script..." 
count=1 
while [ $count -le 5 ] 
do 
    echo "Loop #$count" 
    sleep 1 
    count=$[ $count + 1 ] 
done 
# 
echo "Script is completed." 
exit 
$ 
$ ./backgroundoutput.sh & 
[1] 2615 
$ Starting the script... 
Loop #1 
Loop #2 
Loop #3 
Loop #4 
Loop #5 
Script is completed. 
[1]+ Done ./backgroundoutput.sh 
$

当脚本 backgroundoutput.sh 在后台运行时,命令 pwd 被输入了进来。脚本的输出、用户输入的命令,以及命令的输出全都混在了一起。
最好是将后台脚本的 STDOUT 和STDERR 进行重定向,避免这种杂乱的输出。

$ ./backgroundoutput.sh & 
[1] 2719 
$ Starting the script... 
Loop #1 
Loop #2 
Loop #3 
pwd 
/home/christine/scripts 
$ Loop #4 
Loop #5 
Script is completed. 
[1]+ Done ./backgroundoutput.sh 
$ 
   

运行多个后台作业
在使用命令行提示符的情况下,可以同时启动多个后台作业:

$ ./testAscript.sh & 
[1] 2753 
$ This is Test Script #1. 
$ ./testBscript.sh & 
[2] 2755 
$ This is Test Script #2. 
$ ./testCscript.sh & 
[3] 2757 
$ And... another Test script. 
$ ./testDscript.sh & 
[4] 2759 
$ Then...there was one more Test script. 
$


每次启动新作业时,Linux 系统都会为其分配新的作业号和 PID。通过 ps 命令可以看到,所有脚本都处于运行状态:

$ ps 
 PID TTY TIME CMD 
 1509 pts/0 00:00:00 bash 
 2753 pts/0 00:00:00 testAscript.sh 
 2754 pts/0 00:00:00 sleep 
 2755 pts/0 00:00:00 testBscript.sh 
 2756 pts/0 00:00:00 sleep 
 2757 pts/0 00:00:00 testCscript.sh 
 2758 pts/0 00:00:00 sleep 
 2759 pts/0 00:00:00 testDscript.sh 
 2760 pts/0 00:00:00 sleep 
 2761 pts/0 00:00:00 ps 
$ 


在终端会话中使用后台进程一定要小心。注意,在 ps 命令的输出中,每一个后台进程都和终端会话(pts/0)终端关联在一起。
如果终端会话退出,那么后台进程也会随之退出

你可能感兴趣的:(linux,运维,服务器)