Когда программа, работающая в фоновом режиме, пытается читать с терминала, она останавливается сигналом SIGTTIN . В настоящее время ввод идет в процесс переднего плана¹; если бы ввод произвольно поступал в программу переднего плана или в фоновую программу, это было бы разрушительно. Таким образом, фоновая программа приостанавливается, пока не будет переведена на передний план.
Если вам нужно передать данные в вашу программу только в начале, передайте их в нее.
echo "config=foo" | ./my_app &
Если вам нужно время от времени взаимодействовать с программой, но большую часть времени она может выполняться автоматически, запустите ее в терминальном мультиплексоре, таком как Screen или Tmux . Например, с экраном:
screen -S my_app ./my_app
Введите необходимый ввод, затем нажмите Ctrl + A , чтобы отключить сеанс экрана, т.е. позволить ему работать в фоновом режиме и вернуться к исходному Терминал. Если вы хотите снова взаимодействовать с программой, повторно подключитесь к сеансу экрана:
screen -S my_app -rd
Если вам нужно выполнять некоторые сложные взаимодействия автоматически, напишите сценарий expect (или сценарий на другом языке с аналогичной библиотекой ).
¹ Группа процессов, но я не буду здесь вдаваться в подробности.
So how can I instruct tar to ignore missing input files?
Es realmente simple :simplemente use el indicador --ignore-failed-read
en 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 tar
solo devuelve 0 si todo está bien, o si el único archivo que falta es myfile
... con esto, tar
devuelve 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 stderr
de tar
a/dev/null
)si myfile
no existe, tar
devuelve0
(si no hay otros errores, por supuesto )y obtienes esto enstderr
:/bin/tar: myfile: Warning: Cannot stat: No such file or directory
tar
manual 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-read
suprima 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, tar
no 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 tail
no 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.
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 tar
solo 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 ls
comando :de esta manera, evita cualquier alias ls
, por lo tanto, su salida es más confiable)
Если есть возможность изменить tar
, вызовите:
test -e myfile && myfile=myfile || myfile=
/bin/tar -cz data config $myfile 2>/dev/null |