Uso de espacio en disco nativo de Raku

9 minutos de lectura

avatar de usuario
uxer

Objetivo:

  • Guarde un programa que escribe datos en el disco a partir de vanos intentos de escribir en un sistema de archivos completo;
  • Ahorre ancho de banda (no descargue si no hay ningún lugar para almacenar);
  • Ahorre tiempo y nervios al usuario y al programador (infórmeles del problema en lugar de que se tiren de los pelos leyendo mensajes de error engañosos y “¡por qué diablos este software no funciona!”).

La pregunta viene en 2 partes:

  1. Informes de estadísticas de espacio de almacenamiento (disponible, utilizado, total, etc.), ya sea de todos los sistemas de archivos o del sistema de archivos al que pertenece la ruta en cuestión.
  2. Informar un error del sistema de archivos al quedarse sin espacio.

Parte 1

Compartir por favor NATIVO Raku alternativa(s) (TIMTOWTDIBSCINABTE “Tim Toady Bicarbonato”) a:

raku -e 'qqx{ df -P $*CWD }.print'

Aquí, raku -eejecuta df (sin disco) programa externo a través de comillas de shell con interpolación qqx{}alimentación -Pargumento de formato de tabla y $*CWD Directorio de trabajo actual, luego .printes el dfsalida de .


El fragmento inicialmente había sido escrito como raku -e 'qqx{ df -hP $*CWD }.print' – con ambos -hlegible por humanos y -Portable, pero resultó que no es un comando omnipresentemente válido. En OpenBSD 7.0sale con un error: df: -h and -i are incompatible with -P.
Para agregar legibilidad humana, puede considerar Número::Bytes::Módulo humano

  • Hola. Bienvenido a SO y al [raku] etiqueta. 🙂 Esto me lee como un pregunta XY. Por ejemplo, en un sistema operativo que ya tiene un df como programa, lo sensato sería usarlo (pero usando run no qx por seguridad). En un sistema operativo conafuera a df como un programa, es decir, un sistema operativo muy inmaduro, es probable que Raku no tenga ninguna posibilidad de compensar. Pero no has hablado de esos aspectos. Así que quizás tu real propósito es aprender sobre Raku? Sea lo que sea, creo que ayudaría mucho si editara su pregunta para agregar lo que realmente hay detrás de su pregunta.

    – raif

    2 de agosto de 2021 a las 18:13

  • @raiph Hola raiph. Gracias por tu atención. Los problemas de comunicación existen, en este caso, francamente, no veo ninguna declaración errónea en mi pregunta. El “Propósito” de la línea de fondo puede ser algo pesado, pero describe exactamente lo que quiero. El fragmento hace exactamente lo que quiero, excepto que no es nativo. OK, 1. Mi tarea actual es: necesito descargar y guardar algunas cosas, luego remodelarlas guardando el caché intermedio y finalmente guardar el resultado. Esto consume espacio de almacenamiento, por lo que considero que verificar el espacio disponible de antemano y durante el curso es una buena idea. [continued on the next comment]

    – uxer

    3 de agosto de 2021 a las 16:42

  • @raiph 2. Entiendo run 'df', '-hP', $*CWD puede ser más seguro ya que este formulario facilita el suministro de piezas con cuidado, pero es run «df -hP $*CWD» más seguro que qqx{}? ¡También eres libre de tirarle basura! 3. Elegí qqx{} sobre run porque el primero hace que la salida esté disponible directamente. me gustaría split y luego verifique el espacio disponible mediante programación. [continued on the next comment]

    – uxer

    3 de agosto de 2021 a las 16:42

  • @raiph 4. Sí, aprendo Raku, cometiendo errores evidentes. 5. Si el tema va más allá de Raku, ¿se trata más bien de la arquitectura de sistemas operativos y sistemas de archivos que de Raku? 6. Aún así, con el poder de Raku, me encojo de hombros ante las respuestas “no nativo”. Al menos esperaba un docs.raku.org/language/nativecall enfoque similar a docs.raku.org/language/… o por un módulos.raku.org/search/?q=inline

    – uxer

    3 de agosto de 2021 a las 16:42


  • Hola de nuevo @uxer. Estoy de acuerdo contigo en que no hubo errores. En términos más generales, no había nada equivocado con lo que habías escrito. Pero la información que ha agregado mejora enormemente su pregunta. desde entonces me he encontrado un problema de GH (muy plausiblemente abierto/cerrado por usted, pero no importa de ninguna manera) ese es un excelente ejemplo motivador. Es dolor y molestia evitables; seguramente podemos (y debemos) hacerlo mejor?

    – raif

    3 de agosto de 2021 a las 22:06

avatar de usuario
Elizabeth Matijsen

raku -e 'run <<df -hP $*CWD>>'

Si solo estás emitiendo lo que df te da en STDOUT, no necesitas hacer nada.

los << >> son palabras entre comillas dobles, por lo que $*CWD será interpolado.

  • mi pregunta es como convertir raku -e 'qx{ echo "from external program" }.print' dentro raku -e 'put "from Raku"'pero con espacio de almacenamiento

    – uxer

    2 de agosto de 2021 a las 11:10


  • Lo siento, añadido raku -e a la respuesta

    – Elizabeth Mattijsen

    2 de agosto de 2021 a las 11:13

  • Si te refieres a la información de df estar disponible de forma nativa para Raku sin que llamando al df programa externo, la respuesta es: “no, Raku no hace eso”.

    – Elizabeth Mattijsen

    2 de agosto de 2021 a las 11:16

  • Tu fragmento quiere un “>”

    – uxer

    2 de agosto de 2021 a las 11:38

  • Vaya, arreglado 🙂 ¡Gracias!

    – Elizabeth Mattijsen

    2 de agosto de 2021 a las 12:19

Parte 1: informes de estadísticas de espacio de almacenamiento

No hay una función integrada para informar estadísticas de espacio de almacenamiento. Las opciones incluyen:

  • Escribe el código Raku (unas pocas líneas) que usa NativeCall para invocar una llamada de sistema específica de plataforma/sistema de archivos (como statvfs()) y utiliza la información devuelta por esa llamada.

  • Utilice una biblioteca Raku adecuada. FileSystem::Capacity elige y ejecuta un programa externo para usted, y luego hace que los datos resultantes estén disponibles en una forma portátil.

  • Usar run (o similar1) para invocar un programa externo específico como df.

  • Usa un Inline::* adaptador de idioma extranjero para habilitar la invocación de una solución de PL extranjera para informar estadísticas de espacio de almacenamiento y usar la información que proporciona.2

Parte 2: informes que se quedan sin espacio

Raku parece informar claramente No space left on device:

> spurt '/tmp/failwrite', 'filesystem is full!'
Failed to write bytes to filehandle: No space left on device
  in block <unit> at <unknown file> line 1

> mkdir '/tmp/failmkdir'
Failed to create directory '/tmp/failmkdir' with mode '0o777': Failed to mkdir: No space left on device
  in block <unit> at <unknown file> line 1

(Los programadores deberán evitar descartar estas excepciones).

notas al pie

1 run ejecuta un comando externo sin involucrar un caparazón. Esto garantiza que se eliminen los riesgos asociados con la participación de un proyectil. Dicho esto, Raku también admite el uso de un shell (porque puede ser conveniente y apropiado en algunos escenarios). Ver el intercambio de comentarios bajo la pregunta (por ejemplo, este) para una breve discusión de esto, y el shell doc para un resumen del riesgo:

Todos los metacaracteres del shell son interpretados por el shell, incluidas canalizaciones, redireccionamientos, sustituciones de variables de entorno, etc. Los escapes de shell son un grave problema de seguridad y pueden causar confusión con nombres de archivo inusuales. Usar run si quieres estar seguro.

2 Adaptadores de idioma extranjero para Raku (módulos Raku en el Inline:: espacio de nombres) permite que el código Raku use código escrito en otros idiomas. Estos adaptadores no son parte del estándar del lenguaje Raku, y la mayoría son apenas experimentales, si eso, pero, por el contrario, los mejores están en excelente forma y permiten que el código Raku use bibliotecas extranjeras como si estuvieran escritas para Raku. (A partir de 2021 Inline::Perl5 es el más pulido.)

  • “Sugirió no nativo enfoques alternativos a df: use NativeCall para llamar, digamos, statvfs()“. Llamada nativa y statvfs() es un nativo Acercarse. NativeCall está integrado. Con él, uno puede escribir código Raku que interactúa “mágicamente” con las funciones nativas disponibles en la plataforma en la que se ejecuta el programa. (No escribes C, pero necesitas saber suficiente C para salir adelante). statvfs es una función nativa (llamada al sistema) disponible en sistemas operativos *nix. Si no puede hacer que funcione usted mismo, puede hacer otra pregunta SO preguntando cómo llamar statvfs() y utilizar sus datos.

    – raif

    14 de diciembre de 2021 a las 23:12

  • @raiph “Me encogí de hombros ante las respuestas “no native”. Al menos esperaba una… nativecall… o… inline” — “La palabra inglesa “native” es decididamente ambigua; “nativecall” no lo es. Me pregunto si solo hay confusión sobre ¿que?” — Mi lectura de sus palabras en ese comentario es que NativeCall no es nativo. Entonces, sí, hay bastante confusión sobre eso.

    – uxer

    16 dic 2021 a las 13:50


  • @raiph ¿No está algo borrosa la definición de nativo en el caso NativeCall de Raku? No es Raku, es C, por lo que no es nativo, pero es una magia incorporada, ¿entonces es nativo? Entonces, ¿qué tan nativo es exactamente NativeCall? ¿No es una categoría especial de nativos? La respuesta se ha publicado como un wiki de la comunidad, por lo que los expertos en el tema pueden modificar la redacción ellos mismos. Gracias

    – uxer

    16 de diciembre de 2021 a las 13:52

  • Hola @uxer. Gracias por su paciencia. Cuando escribí “NativeCall no lo es”, quise decir que NativeCall no lo es. ambiguo. Desafortunadamente, el inglés lo es, y parece que accidentalmente los confundí sobre lo que sospecho que fue una confusión anterior por parte de Liz (el inglés no es su primer idioma).

    – raif

    16 dic 2021 a las 20:06

  • “¿Qué tan nativo es exactamente NativeCall?” Si “nativo” significa código C o llamadas al sistema, ¡entonces muy! Su objetivo es permitir llamadas usando convenciones de llamadas C y luego usar los resultados de una llamada en Raku. Por ejemplo, si su sistema admite statvfs() o similar, podrías llamarlo y usar su información. (Al menos, afaik; no soy un hacker C, y necesitarías saber suficiente C para entender statvfs(), a pesar de que el código que lo llama y lo usa estaría escrito en Raku.) “¿No es una categoría especial de nativos?” Sí. Eso permite vocación y usar de código nativo sin necesidad de escribe código nativo.

    – raif

    16 dic 2021 a las 20:16


¿Ha sido útil esta solución?