cocoa-applescript - 后台进程shell 命令

cocoa-applescript - background process shell command

我构建了一个程序,该程序涉及对指定的 IP 地址执行 ping 操作以判断它们是否处于活动状态。

repeat for IPaddress in allIPaddresses
try
    do shell script "ping -o -t 1 -c 1 " & IPaddress
    set goodIPs to (goodIPs & IPaddress) -- where goodIPs is a list of online IPs
end try
end repeat

问题是,如果需要,它会在 很多 个 IP 之间循环,并且接口在 ping 时冻结 - 所以如果你需要点击 "Quit" 按钮,你不能,强制退出是停止它的唯一方法。在搜索如何将命令 运行 作为后台进程后,我发现最常见的答案(例如 https://discussions.apple.com/thread/323661?start=0&tstart=0)是添加:

> /dev/null 2>&1 &

或 shell 命令末尾的细微变化(但输出相似)。但这涉及将 stderr 从应用程序发送出去,并且由于我的程序 需要 stderr 来判断 ping 是否成功,所以这不是一个选项。有谁知道如何保持 stderr 正常但将命令移动到后台进程以便界面正常工作?

更新答案

如果你想一次 ping 一个,不管有多慢,并用进度条炫耀缓慢的进度;-)

ping -o -t 1 -c 1 192.168.0.1 > /dev/null 2>&1 && echo up

如果主机启动,这将输出up,如果主机关闭,则不输出任何内容。或者,如果您希望它在主机关闭时输出 down

ping -o -t 1 -c 1 192.168.0.1 > /dev/null 2>&1 && echo up || echo down

第二个答案

您可以使用这样的小脚本在 shell 中完成。将其保存为 pinger,然后使用

使其可执行
chmod +x pinger

然后在您的 Applescript 中,您需要将要检查的 IP 地址列表写入名为 iplist.txt 的文件并使用

do shell script /path/to/wherever/pinger

并获取它的输出。

您可以使用

在终端中尝试
./pinger

这是脚本。

#!/bin/bash
# pinger
#
# Remove results of any previous runs, but suppress any error messages
rm hostup-* 2> /dev/null

# Ping all hosts in "iplist.txt" ...
# ... and create file "hostup-<IP ADDRESS>" for any that are up
while read ip; do
   ( ping -o -t 1 -c 1 $ip > /dev/null 2>&1 && touch hostup-$ip ) &
done < iplist.txt

wait # for all pings to finish

# Now go back through and see who answered
while read ip; do
   filename="hostup-$ip"
   if [ -f "$filename" ]; then
      rm $filename
      echo $ip
   fi
done < iplist.txt

原始答案概要

使用 GNU 并行...