首页 > 解决方案 > 在 shell 脚本中将交互式命令作为后台进程运行

问题描述

当我尝试在 shell 脚本的后台运行交互式命令/应用程序时遇到问题。我正在尝试将命令的输出记录到文件中。但我没有看到该命令将任何内容记录到文件中。即使在 bash 中执行命令也不起作用,因为它被挂起。

示例脚本

#!/bin/bash
while true
do
./a.out > test &
PID=$!
sleep 20
kill -9 $PID
done
[@myprog]$ ./a.out &
[1] 3275
Program started

[1]+  Stopped                 ./a.out
[@myprog]$ 

标签: linuxbashshellscriptingbackground-process

解决方案


您无需创建后台进程来重定向数据。您可以执行以下操作,这将创建一个actions.log包含您的每个操作的日志文件。

#! /bin/bash

while read -p "action " act; do
        echo $act
done > actions.log
exit 0

对你来说,这将是这样的:

$ a.out > test.log

如果您确实想要有一个后台进程,但需要输入数据:

$ function inter_child {
    ./inter.sh  <<-EOF
a
b
c
d
EOF
sleep 10
}
$ inter_child &
$ wait
$ cat actions.log 
a
b
c
d

如果这不能回答您的问题,请更具体地说明您为什么需要创建子进程以及a.out期望什么。希望这可以帮助!

编辑:
stdout 和 stderr 是两个不同的重定向。
将标准错误写入文件2>$ ./a.out 2> error.log
将标准错误重定向到标准输出2>&1$ ./a.out > log.log 2>&1


推荐阅读