小编drw*_*ode的帖子

计算bash数组中元素的个数,其中数组的名字是动态的(即存储在一个变量中)

问题的简要说明:

是否有内置的 bash 方法来计算 bash 数组中元素的数量,其中数组的名称是动态的(即存储在变量中),而无需完全复制数组或使用eval?

更多信息:

使用 bash 参数替换,可以执行以下操作:

  • 确定数组的长度:
    myArr=(A B C); echo ${#myArr[@]}.
  • 按名称间接引用变量:(
    NAME=myVar; echo ${!NAME}
    这也适用于数组元素):
    NAME=myArr[1]; echo ${!NAME}

但是如果一个数组的名称存储在另一个变量中,如何确定数组中元素的数量?(人们可能认为这是一种组合上述两个参数替换。)例如:

myArr=(A B C D)
NAME=myArr
# Get the number of elements in the array indirectly referenced by NAME.
count=${#$NAME[@]}  # This syntax is invalid. What is the right way?
Run Code Online (Sandbox Code Playgroud)

以下是所有失败的多次尝试:

  # Setup for following attempts:
  myArr=(A B C D)
  NAME=myArr
  EXPR1=$NAME[@]          # i.e. EXPR1='myArr[@]'
  EXPR2=#$NAME[@]         # i.e. EXPR2='#myArr[@]' …
Run Code Online (Sandbox Code Playgroud)

bash array parameter shell-script shell-builtin

11
推荐指数
1
解决办法
2万
查看次数

PrivateTmp=true 的服务如何访问 /tmp 目录中的 unix 套接字(例如,从运行在 Apache 中的 PHP 提交 Torque 作业)

我们有一个网络服务器,可以执行用户提交的科学计算。计算可能需要长时间运行,因此我们使用Torque资源管理器(又名 pbs_server)在少数计算节点上分发/调度它们。Torque 使用目录中的 unix 域套接字/tmp进行通信,但 http 服务器(以及从中派生出来的进程)无法访问真正的/tmp目录,因此对于这些进程,套接字似乎丢失,从而导致错误。

细节:

  • Web 服务器正在运行 Apache,它作为具有 systemd 属性PrivateTmp=true集的服务运行。这导致服务拥有自己的/tmp目录,与“真正的”根目录 /tmp 无关。
  • 这些作业实际上是从 PHP 提交的(在 Apache 进程中运行)。PHP 对 进行系统调用qsub,这是提交作业的 Torque 命令。因为qsub是从 PHP 调用的,所以它继承了/tmpApache的“fake”目录。
  • qsub在内部尝试连接到位于 的 unix 套接字/tmp/trqauthd-unix。但由于它没有看到真正的 /tmp 目录,它失败并出现以下错误: Error in connection to trqauthd (15137)-[could not connect to unix socket /tmp/trqauthd-unix: 2]

我能实现的唯一解决方案是编辑 systemd 下的 httpd.service 文件并将其更改PrivateTmp为 false。这确实解决了问题。但我宁愿不这样做,因为(我假设) PrivateTmp 被设置为 true 是有充分理由的。

我想知道的是,是否有任何方法可以在不同的位置创建套接字,或者以某种方式建立到可以从 Apache(及其分叉进程)内部使用的套接字的链接。

创建到套接字的链接是微不足道的,但它并不能解决问题,因为我不知道有什么方法可以配置qsub …

systemd apache-httpd torque unix-sockets

4
推荐指数
1
解决办法
5703
查看次数