我一直在用这个撞击墙壁一段时间.
我想要SSH到一组机器并检查它们是否可用(接受连接而不是被使用).我创建了一个小脚本tssh,它就是这样做的:
#!/bin/bash
host=$1
timeout=${2:-1}
ssh -qo "ConnectTimeout $timeout" $host "[ \`who | cut -f1 | wc -l \` -eq 0 ] && exit 0 || exit 1"
Run Code Online (Sandbox Code Playgroud)
此脚本正常工作.如果出现连接问题则返回255,如果机器正忙则返回1,如果一切正常则返回0.如果有人知道更好的方法,请告诉我.
接下来我尝试使用while读取循环在我的机器上调用tssh,这就是出错的地方.一旦tssh返回0,循环就会退出,并且永远不会完成整个集合.
while read nu ; do tssh "MYBOXES$nu" ; done < <(ruby -e '(0..20).each { |i| puts i }')
Run Code Online (Sandbox Code Playgroud)
起初我认为这是一个子壳问题,但显然不是.任何帮助,以及对风格/内容的评论,将不胜感激!我知道当我发现原因时我会踢自己...
我正在编写一个shell脚本,通过Handbrake批量处理.mov文件,以节省高清空间.该脚本使用"find"搜索目录,然后在找到的每个.mov文件上运行Handbrake,将生成的文件的创建日期与源文件的日期匹配为"touch".
我最初使用for循环执行此操作:
for i in $(find "$*" -iname '*.mov') ; do
~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
touch -r "$i" "$i".mp4
done
Run Code Online (Sandbox Code Playgroud)
这有效,但如果输入文件的文件名中有空格,则会失败.所以我尝试了一个while循环:
find "$*" -iname '*.mov' | while read i ; do
~/Unix/HandbrakeCLI --input "$i" --output "$i".mp4 --preset="Normal"
touch -r "$i" "$i".mp4
done
Run Code Online (Sandbox Code Playgroud)
这个循环的问题是它适用于目录中的第一个文件,然后退出循环.请注意,如果我在while循环体中替换"echo $ i",它会打印目录中的所有.mov文件,因此循环结构正确.
我相信我对这个stackoverflow线程的问题有部分答案.但该解决方案特定于ssh,并不能解决一般问题.似乎与子进程使用的stdin有关,但我不完全理解它是如何工作的.
有什么建议?
我在OSX 10.6上