如何添加nohup? - 将stdin重定向到程序和后台

时间:2017-12-31 16:25:46

标签: linux bash shell pipe

我有一个程序prog,它接受​​stdin输入:

prog < test.txt

但是处理需要花费很多时间,因此一旦读取输入,该过程就应该是后台。

从这个答案https://unix.stackexchange.com/a/71218/201221我有工作解决方案,但没有nohup。如何修改它以使用nohup

#!/bin/sh
{ prog <&3 3<&- & } 3<&0

2 个答案:

答案 0 :(得分:3)

disown是一个内置的shell,它告诉bash从其记录保存中删除一个进程 - 包括转发HUP信号的记录保存。因此,如果stdin,stdout和stderr在终端消失之前都被重定向或关闭,那么只要你使用nohup就完全没有disown

#!/bin/bash

logfile=nohup.out            # change this to something that makes more sense.
[ -t 1 ] && exec >"$logfile" # do like nohup does: redirect stdout to logfile if TTY
[ -t 2 ] && exec 2>&1        # likewise, redirect stderr away from TTY

{ prog <&3 3<&- & } 3<&0
disown

如果确实需要与POSIX sh兼容,那么您需要将stdin捕获到文件中(效率可能非常高):

#!/bin/sh

# create a temporary file
tempfile=$(mktemp "${TMPDIR:-/tmp}/input.XXXXXX") || exit

# capture all of stdin to that temporary file
cat >"$tempfile"

# nohup a process that reads from that temporary file
tempfile="$tempfile" nohup sh -c 'prog <"$tempfile"; rm -f "$tempfile"' &

答案 1 :(得分:0)

从我看到的内容中,以下代码包含在一个单独的shell文件中:

#!/bin/sh
{ prog <&3 3<&- & } 3<&0

那么,为什么不尝试:

nohup the_file.sh &