【问题标题】:"kill %1" fails and prints "No such process" inside script“kill %1”失败并在脚本中打印“No such process”
【发布时间】:2020-03-19 08:28:59
【问题描述】:

我目前使用 dash 作为主 shell。
我试着写了一个小函数,应该模仿等待,但有一些文字。

这是一个最小的工作代码:

#!/bin/dash

wait() {
  echo Waiting...
  local pid="${1}"; shift
  local delay=.250
  while kill -0 "${pid}" 2>/dev/null; do
    echo Still waiting...
    sleep "${delay}"
  done
  echo Resuming
}

main() {
  sleep 3 &
  wait %1
}

main

如果您将其复制粘贴到 dash shell 中,您会看到代码运行良好。
无论如何,如果您尝试将其保存在文件中,它不会。

经过一些故障排除后,我发现删除2>/dev/null,您会看到一条错误消息:kill: No such process但是使用command wait "${pid}" 它只是在等待它。 p>

例如:

#!/bin/dash

wait() {
  echo Waiting...
  local pid="${1}"; shift
  command wait "${pid}"
  echo Resuming
}

main() {
  sleep 3 &
  wait %1
}

main

作为文件脚本也可以正常工作。

我不确定我在这段代码中哪里/哪里错了,我尝试的一些方法没有帮助。

在试验中,我尝试将 %1 转换为其 pid,但子 shell(例如 var="$(jobs -p %1)")中的 jobs -p %1 严重失败。

有什么建议吗?

【问题讨论】:

  • 使用实际的 PID (wait $!) 而不是像 %1 这样的作业规范,即使在没有交互式扩展的情况下编译的 shell 也可以工作。
  • @Charles 为非交互式 shell 启用作业控制有什么注意事项吗?
  • @oguzismail,只有带有可选用户可移植实用程序扩展至基线 POSIX 标准的 shell 才完全支持作业控制。我绝对可以构想出一个小型的busybox构建或不包含它们的东西。

标签: shell kill dash-shell


【解决方案1】:

Job control 在非交互式 shell 中被禁用。使用set -m 启用它,或者将-m 附加到shebang,它会起作用。

例子:

$ dash -c 'sleep 1 & kill %1 && echo success'
dash: 1: kill: No such process

$ dash -m -c 'sleep 1 & kill %1 && echo success'
success

【讨论】:

    猜你喜欢
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多