tar to stdout: отсутствуют входные файлы, не влияя на PIPESTATUS

Когда программа, работающая в фоновом режиме, пытается читать с терминала, она останавливается сигналом SIGTTIN . В настоящее время ввод идет в процесс переднего плана¹; если бы ввод произвольно поступал в программу переднего плана или в фоновую программу, это было бы разрушительно. Таким образом, фоновая программа приостанавливается, пока не будет переведена на передний план.

Если вам нужно передать данные в вашу программу только в начале, передайте их в нее.

echo "config=foo" | ./my_app &

Если вам нужно время от времени взаимодействовать с программой, но большую часть времени она может выполняться автоматически, запустите ее в терминальном мультиплексоре, таком как Screen или Tmux . Например, с экраном:

screen -S my_app ./my_app

Введите необходимый ввод, затем нажмите Ctrl + A , чтобы отключить сеанс экрана, т.е. позволить ему работать в фоновом режиме и вернуться к исходному Терминал. Если вы хотите снова взаимодействовать с программой, повторно подключитесь к сеансу экрана:

screen -S my_app -rd

Если вам нужно выполнять некоторые сложные взаимодействия автоматически, напишите сценарий expect (или сценарий на другом языке с аналогичной библиотекой ).

¹ Группа процессов, но я не буду здесь вдаваться в подробности.

0
13.05.2018, 03:44
2 ответа

So how can I instruct tar to ignore missing input files?

Es realmente simple :simplemente use el indicador --ignore-failed-readen su comando tar:

$/bin/tar -cz --ignore-failed-read data config myfile 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

$echo ${PIPESTATUS[0]}

> 0

Por cierto :Tenga en cuenta que la respuesta de Hauke ​​Laging es más engorrosa, pero tarsolo devuelve 0 si todo está bien, o si el único archivo que falta es myfile... con esto, tardevuelve 0 si todo está bien, o incluso cuando falta algún archivo.


Con esto:

/bin/tar -cz --ignore-failed-read data config myfile | /bin/dd of=backup.tar 2>/dev/null

(tenga en cuenta que no estoy redirigiendo stderrde tara/dev/null)si myfileno existe, tardevuelve0(si no hay otros errores, por supuesto )y obtienes esto enstderr:/bin/tar: myfile: Warning: Cannot stat: No such file or directory

tarmanual dice:

‘--ignore-failed-read’ Do not exit with nonzero on unreadable files or directories. This option has effect only during creation. It instructs tar to treat as mild conditions any missing or unreadable files (directories). Such failures don’t affect the program exit code, and the corresponding diagnostic messages are marked as warnings, not errors. These warnings can be suppressed using the ‘--warning=failed-read’ option

pero, lamentablemente, --warning=failed-readsuprima todas las advertencias sobre errores de lectura -:en su caso, suprima las advertencias sobre un archivo que no existe, pero también suprima las advertencias sobre errores de E/S , por ejemplo... está lejos de ser óptimo; aparentemente, tarno tiene una bandera para decirlo:oye,supresión fallida -advertencia de lectura solo si el archivo no existe , entonces, puede ser, esto resuelva su problema:

/bin/tar -cz --ignore-failed-read data config myfile 2> >(grep -v 'No such file or directory' 1>&2) | /bin/dd of=backup.tar 2>/dev/null

esto:>(... )es Sustitución de procesos

de esta manera, su comando tailno cambia su número de retorno si el archivo no existe, no recibe mensajes de advertencia sobre archivos faltantes y recibe mensajes de advertencia sobre cualquier otro error de lectura.


esto>

No puedo evitar pensar que ninguna de estas soluciones es realmente buena, así que se me ocurrió esto:

/bin/tar -cz -T <(\ls -A -1) 2>/dev/null | /bin/dd of=backup.tar 2>/dev/null

con esto, está enviando a tarsolo los archivos que realmente existen en el momento de la ejecución del comando :no necesita preocuparse por sus nombres, o incluso qué archivo existe o no :usted siempre ejecute el mismo comando (sin importar qué ), escala perfectamente si falta 1 archivo, o n archivos faltantes, y no pierde ningún error.

(tenga en cuenta la barra invertida si está delante de lscomando :de esta manera, evita cualquier alias ls, por lo tanto, su salida es más confiable)

2
28.01.2020, 04:23

Если есть возможность изменить tar, вызовите:

test -e myfile && myfile=myfile || myfile=
/bin/tar -cz data config $myfile 2>/dev/null |
0
28.01.2020, 04:23

Теги

Похожие вопросы