我有一个程序prog
,它接受stdin输入:
prog < test.txt
但是处理需要花费很多时间,因此一旦读取输入,该过程就应该是后台。
从这个答案https://unix.stackexchange.com/a/71218/201221我有工作解决方案,但没有nohup
。如何修改它以使用nohup
?
#!/bin/sh
{ prog <&3 3<&- & } 3<&0
答案 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 &