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 并行...
我构建了一个程序,该程序涉及对指定的 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 并行...