一、后台执行

1. 使用&符号在后台执行命令

你可以在Linux命令或者脚本后面增加&符号,从而使命令或脚本在后台执行,例如:.

$ ./my-shell-script.sh &

2. 使用nohup在后台执行命令

使用&符号在后台执行命令或脚本后,如果你退出登录,这个命令就会被自动终止掉。要避免这种情况,你可以使用nohup命令,如下所示:

$ nohup ./my-shell-script.sh &

3. 使用screen执行命令

通过nohup&符号在后台执行命令后,即使你退出登录,这个命令也会一直执行。但是,你无法重新连接到这个会话,要想重新连接到这个会话,你可以使用screen命令。.

Linux的screen命令提供了分离和重新连接一个会话的功能。当你重新连接这个会话的时候,你的终端和你分离的时候一模一样。

4. 使用 at 将一个命令作为批处理执行

使用at命令,你可以让一个命令在指定的日期和时间运行,例如要在明天上午10点在后台执行备份脚本,执行下面的命令:

$ at -f backup.sh 10 am tomorrow

5. 使用watch连续地执行一个命令

要想按一个固定的间隔不停地执行一个命令,可以使用watch命令,如下所示:

$ watch df -h

(df: Disk Free, 显示系统上可使用的磁盘空间)

二、重定向

在shell脚本中,默认情况下,总是有三个文件处于打开状态,标准输入(键盘输入)、标准输出(输出到屏幕)、标准错误(也是输出到屏幕),它们分别对应的文件描述符是0,1,2 。

>  默认为标准输出重定向,与 1> 相同
2>&1  意思是把 标准错误输出 重定向到 标准输出.

&>file 意思是把标准输出 和 标准错误输出 都重定向到文件file中

三、示例

串行执行多个 luigi 任务

test.sh

#!/usr/bin/env bash

cd /home/your_name

export PYTHONPATH=/home/your_name_foder

luigi --module xxx --data xxx --start-date 2020-12-01 --date 2021-01-05 --workers 10 > ./my_log.log 2>&1
luigi --module xxx --data xxx --start-date 2020-12-01 --date 2021-01-05 --workers 10 > ./my_log.log 2>&1
...

命令行执行:

nohup ./test.sh &

nohup ... & 表示后台执行

注:如果 shell 脚本的里面每个job都采用后台执行的话,那么总的并发数 = worker(10) * num_jobs,这样并发量太高(job 之间就是并行而非串行了)

参考:

  1. shell脚本后台运行
  2. Linux命令大全(手册)
  3. Shell重定向 &>file、2>&1、1>&2 、/dev/null的区别
  4. Linux shell中2>&1的含义解释 (全网最全,看完就懂)