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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何添加nohup? - 将stdin重定向到程序和背景相关的知识,希望对你有一定的参考价值。

我有一个程序prog,它接受stdin输入,如下所示:

prog < test.txt

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

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

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

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"' &
另一答案

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

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

所以,为什么不尝试:

nohup the_file.sh &

以上是关于如何添加nohup? - 将stdin重定向到程序和背景的主要内容,如果未能解决你的问题,请参考以下文章

nohup命令

linux中报错“把输出追加到nohup.out”啥意思?

linux重定向及nohup不输出的方法

LINUX 标准错误输出重定向

Linux之nohup命令

怎样去掉提示:nohup:重定向标准错误到标准输出