【问题标题】:Setting variables in a KSH spawned process在 KSH 衍生进程中设置变量
【发布时间】:2012-10-29 05:02:47
【问题描述】:

我有一个冗长的菜单脚本,它的变量依赖于一些命令输出。这些命令需要几秒钟才能运行,我想生成新进程来设置这些变量。它看起来像这样:

VAR1=`somecommand` &
VAR2=`somecommand` &
...
wait
echo $VAR1 $VAR2

问题在于,进程会随着它们设置的变量而产生和死亡。我意识到我可以通过将这些发送到一个文件然后读取它来做到这一点,但我想在没有临时文件的情况下做到这一点。有什么想法吗?

【问题讨论】:

  • Korn shell 还不支持多线程。它可能有一天会得到支持,但不是现在。还是您混淆了线程和进程?
  • 我想我理解你的问题,问题是你需要多线程或非阻塞管道或套接字。现在 Korn shell 都不支持。你需要一种更强大的语言。
  • 是的,我的错。 & 将产生一个不是线程的新进程。而且我为此仅限于 ksh,因此我无法使用更强大的语言。

标签: multithreading variables ksh


【解决方案1】:

您可以使用命令替换获得整个过程的输出,例如:

VAR1=$(somecommand &)
VAR2=$(somecommand &)
...
wait
echo $VAR1 $VAR2

【讨论】:

  • 不幸的是,这个方法仍然阻塞直到进程完成,因为它在设置变量之前等待“somecommand”完成。
  • 由于您不想被阻止,因此无法通过其他流程来实现。因为,& 创建了一个新进程,进程无法直接与某些 IPC 机制交换数据。为什么你不想使用临时文件?如果您不想要这些数据,您可以在获取数据后将其删除。
【解决方案2】:

这有点笨拙,但对我有用。我有三个脚本。

cmd.sh 是你的“一些命令”,它只是一个测试脚本:

#!/bin/ksh
sleep 10
echo "End of job $1"

下面是wrapper.sh,它运行单个命令,捕获输出,完成后向父级发送信号,然后将结果写入标准输出:

#!/bin/ksh
sig=$1
shift
var=$($@)
kill -$sig $PPID
echo $var

这是父脚本:

#!/bin/ksh

trap "read -u3 out1" SIGUSR1
trap "read -p out2" SIGUSR2

./wrapper.sh SIGUSR1 ./cmd.sh one |&
exec 3<&p
exec 4>&p

./wrapper.sh SIGUSR2 ./cmd.sh two |&
wait
wait
echo "out1: $out1, out2: $out2"
echo "Ended"

2x 等待,因为第一个将被中断。

在父脚本中,我运行包装器两次,每个作业一次,传入要运行的命令和任何参数。 |&amp; 表示“到后台的管道” - 作为协同进程运行。

两个exec 命令将管道文件描述符复制到 fds 3 和 4。当作业完成时,包装器向主进程发出信号以读取管道。使用trap 捕获信号,该trap 读取相应子进程的管道,并收集结果数据。

相当复杂和笨拙,但它似乎有效。

【讨论】:

猜你喜欢
  • 2019-02-02
  • 1970-01-01
  • 1970-01-01
  • 2010-09-12
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
相关资源
最近更新 更多