Intenté hacer esta pregunta hoy mismo, pero finalmente me di cuenta de que había desordenado completamente lo que intentaba preguntar y también publiqué el código script equivocado. Este es el intento #2.
Tengo dos Macs que se reinician automáticamente cada mañana para que todos sus servicios funcionen de forma óptima. Cada Mac necesita montar un volumen en el otro después de arrancar. Esto es bastante fácil de hacer, excepto en el caso de que una máquina se cuelgue durante el reinicio por cualquier motivo.
Si una de las máquinas no está disponible cuando la otra arranca, obviamente su intento de montar la máquina no disponible fallará. El script está diseñado para ejecutarse cada minuto más o menos en un bucle mientras el volumen remoto no haya sido montado, ya que eventualmente lo hará. Pero cuando el montaje falla, produce un diálogo de error en la máquina que intenta realizar el montaje, que entonces rompe el bucle y el script no se repite.
¿Existe una manera en AppleScript para intentar montar un servidor, pero sin un diálogo de error si ese servidor no está disponible en el momento?
Creía que este era el objetivo principal de los bloques de prueba, pero no ha supuesto ninguna diferencia.
Aquí está el script que actualmente ejecuto en el arranque (es una aplicación de Automator). El flujo de trabajo es un bloque Get Specified Server, seguido de un bloque Run AppleScript. Aquí está el AppleScript:
on run {input, parameters}
try
set server to (item 1 of input) -- this gets the server address from the Get Specified Servers block
end try
set vol to "Streaming"
tell application "Finder"
set isConnected to disk vol exists
end tell
repeat while isConnected = false -- as long as the volume is not present, try to mount it
try
tell application "Finder"
mount volume server & "/" & vol -- This produces the error dialog and halts the script, if the server is unavailable
end tell
end try
delay 2
tell application "Finder"
set isConnected to disk vol exists
end tell
if isConnected = false then
delay 60 -- if the volume still doesn't exist, wait a minute before trying again
end if
end repeat
return input
end run
Todo funciona perfectamente siempre que el volumen remoto esté listo y accesible. Pero si no es así, aparece el diálogo de error.
Edición: He encontrado este hilo y este hilo bastante complicado en otros lugares que intentan abordar el mismo problema, pero no parece que se haya encontrado una solución sencilla y definitiva.
0 votos
Como mencionaste en otro post que el servidor estaba configurado para Compartir archivos , si no está ejecutando un Servidor web también, entonces
curl
fallará aunque el servidor esté disponible. En ese caso, puede sustituirlo porping
Por ejemploping -t 2 -c 1 192.168.2.102 2>/dev/null | awk '/0 packets received/{print $4}'
devuelve0
si falla. Dicho esto, y mencionando algo de otro post sobre el servidor colgado en el reinicio... Dependiendo de en qué parte del proceso se cuelgue,ping
podría tener éxito sin el Compartir archivos recurso que está disponible.0 votos
Buen punto, y no, no tengo un servidor web, así que tendré que ver qué funciona y con qué fiabilidad.
0 votos
Ver mi respuesta editada... @user3439894 tiene toda la razón en que mi método no debería funcionar, ahora que lo pienso. Lo que no sé es por qué funciona...
0 votos
Sólo una información El
mount volume
comando forma parte de Adiciones estándar en AppleScript no Buscador y no debe ser envuelto en untell application "Finder"
bloque . En otras palabras, Buscador no entiende elmount volume
comando y de hecho falla silenciosamente conerror number -10004
y luego tiene que ejecutar el comando de nuevo.0 votos
Es extraño, ha funcionado muy bien dentro de ese bloque de tell. Sin embargo, he quitado el tell y sigue funcionando, así que lo dejaré sin él para estar seguro. Gracias.
1 votos
Sí, todavía funciona con el
tell application "Finder"
bloque porque AppleScript se come el error y luego corre elmount volume
comando de nuevo en su contexto adecuado. Es un error no fatal e impropio codificación ya que usurpa innecesariamente CPU ciclos .