linux - 在 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]$
解决方案
您无需创建后台进程来重定向数据。您可以执行以下操作,这将创建一个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
推荐阅读
- java - 使用默认服务帐户的 Bigquery 插入作业
- javascript - 如何在 HTML 元素而不是 JavaScript 警报中显示 JavaScript 函数的输出?
- javascript - 我正在尝试从最低级别组件的输入字段中捕获数据
- javascript - How to get a certain number of unique random numbers in a certain range?
- python - 如何将数据从 python 传输到 opc da 服务器?
- python - 如何比较两列不同的数据框并创建一个新的
- swift - How can I change from collection view to table view by selected scope?
- dns - Traceroute 在同一网络上返回不同的结果
- angular - 用于生成的 Laravel 护照令牌
- google-analytics - 在没有多次调用的情况下查询维度的基数?