Не то, чтобы очень вопрос "правильной" файловой системы, но как Вы используете его и как Вы монтируете его.
В случае ext3 и ext4 можно использовать ro, синхронизацию, dirsync опции.
Файловые системы с поглощенным журналом записи обычно лучше, если метаданные синхронизируются перед фактической записью.
В Вашем случае, возможно, случилось так, что кэш библиотеки (/etc/ld.so.cache) был поврежден - простое ldconfig
возможно, решил проблему.
Иногда необходимо вынудить полную проверку файловой системы найти и исправить ошибки. Иногда Вам нужна спасательная начальная загрузка через Netboot или CD/DVD (изображение), чтобы сделать так.
fsck -f -y ...
- запишите вывод в файл журнала для более позднего обзора.
После этого пройдите каждый файл/каталог, о котором сообщили как багги, и вид пакета все еще в порядке (в основанных системах об/мин: rpm -V
) - Debian должен иметь сопоставимый механизм для определения, которые упаковывают файл, принадлежит и проверить целостность пакета.
Обратите внимание, что ответ Томми Кинтола зависит от того, что приемник будет использоваться, так что вы действительно можете получить номер приемника.
Также обратите внимание, что он полагается на то, что именованные индексы приемников совпадают с подсчитываемым индексом. Скажем, например, у нас есть 3 раковины 1, 2 и 3, и эта 3 является нашей выбранной раковиной, затем мы отключаем номер 2, оставляя нам 1 и 3. Теперь вы не можете считать до 3 раковин с решением Томми Кинтола, потому что раковины pactl list | grep "^ [[: space:]] Volume:"
будет выводить только 2 поля Volume, таким образом, переход к заголовку / хвосту для получения строки $ SINK + 1
не будет работать. ( Я испытал это на себе, я не просто придираюсь к мелочам)
Мое решение работает на основе предположения, что pacmd всегда будет перечислять приемники в определенном порядке. Если вам нужно более надежное решение, вам нужно проанализировать вывод.
#!/bin/sh
# Get the index of the selected sink:
getsink() {
pacmd list-sinks |
awk '/index:/{i++} /* index:/{print i; exit}'
}
# Get the selected sink volume
getvolume() {
pacmd list-sinks |
awk '/^\svolume:/{i++} i=='$(getsink)'{print $5; exit}'
}
getvolume
Примечание: я не знаю, различаются ли поля громкости, мое выглядит так (из pacmd list-drops
):
volume: front-left: 42706 / 65% / -11.16 dB, front-right: 42706 / 65% / -11.16 dB
Также я получаю громкость только первого канала (передний -left) в процентном формате (например, поле 5), ваши каналы могут быть на разных уровнях.
РЕДАКТИРОВАТЬ:
Если подумать, вы, вероятно, действительно захотите получить имя приемника по умолчанию из pacmd stat
для менее запутанного решения:
#/bin/sh
getdefaultsinkname() {
pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}
getdefaultsinkvol() {
pacmd list-sinks |
awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
/^\s+volume: / && indefault {print $5; exit}'
}
setdefaulsinkvol() {
pactl $(getdefaultsinkname) $1
}
Для получения объема я пробую эту:
echo `(pactl list sinks | grep "Volume: 0:")| awk '{print $3}'`
pactl list sinks | grep '^[[:space:]]Volume:' | \
head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,'
Вот что у меня есть. Неприятно, но мне хватило. Я не мог найти способа сделать это. pactl
просто, похоже, не имеет никаких средств получения листинга только для одного приемника, но они печатаются в возрастающем порядке. Таким образом, выбирается n-я строка с использованием хвоста
и головы
. Обратите внимание, что в строке громкости могут быть отдельные объемы для правого и левого каналов, и что замена sed
выбирает только первый, потому что мне это и нужно.
Для записи, я использую список приемников pactl short
, чтобы получить номер моего активного приемника:
pactl list short | grep RUNNING | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,'
РЕДАКТИРОВАТЬ 2017-10-05: Мне пришлось немного подправить их из-за изменений в pulseaudio. Вот что у меня сейчас:
SINK=$( pactl list short sinks | sed -e 's,^\([0-9][0-9]*\)[^0-9].*,\1,' | head -n 1 )
NOW=$( pactl list sinks | grep '^[[:space:]]Volume:' | head -n $(( $SINK + 1 )) | tail -n 1 | sed -e 's,.* \([0-9][0-9]*\)%.*,\1,' )
У меня MOD
установлено на +10 или -10, я провожу некоторые проверки границ и, наконец:
pactl set-sink-volume $SINK ${MOD}%
Многоязычный вариант:
pactl list sink-inputs | \
grep -A15 -P "(\#|№)$SINK" | \
grep -P "\d+\s*\/\s*\d+\%" | \
head -1 | \
awk "{print \$5}"
Проверено на pactl 5.0
Поскольку я еще не могу комментировать (подписался специально, чтобы улучшить ответ @ jgr), в случае, если ваш приемник по умолчанию является плагином (как любое количество плагинов ladspa), его решение редактирования вернет XX% (примечание конечная запятая), так что это работает немного лучше. Извините, моя awk-fu очень проста, я уверен, что есть способ лучше.
В модифицированном решении также опущен «%», поскольку я не вижу смысла в его сохранении, и если мы вернем только число, мы сможем использовать его в математике. Также исправлен случай setvol, который в моем случае требует особых инструкций.
#/bin/sh
getdefaultsinkname() {
pacmd stat | awk -F": " '/^Default sink name: /{print $2}'
}
getdefaultsinkvol() {
pacmd list-sinks |
awk '/^\s+name: /{indefault = $2 == "<'$(getdefaultsinkname)'>"}
/^\s+volume: / && indefault {print $5; exit}' |
awk -F"%" '{print $1}'
}
setdefaultsinkvol() {
pactl -- set-sink-volume $(getdefaultsinkname) $1
}
Вы можете использовать amixer
для чтения тома pulseaudio с помощью опции mixer следующим образом.
$ amixer -c $CARD -M -D $MIXER get $SCONTROL
# CARD is your sound card number, mixer is either alsa or pulse and scontrol is the alsa device name, Master if you want to use pulse.
$ amixer -c 1 -M -D pulse get Master
Simple mixer control 'Master',0
Capabilities: pvolume pswitch pswitch-joined
Playback channels: Front Left - Front Right
Limits: Playback 0 - 65536
Mono:
Front Left: Playback 27662 [42%] [on]
Front Right: Playback 27662 [42%] [on]
Теперь мы можем разобрать его с помощью grep
или sed
или perl
.
$ amixer -c 1 -M -D pulse get Master | grep -o -E [[:digit:]]+%
Я обнаружил, что некоторые ответы здесь ограничены, особенно если у вас несколько приемников. Поэтому я хочу поделиться тем, что я нашел.
В исходном коде для pulseaudio -ctl есть множество отличных скриптов для «получения» и установки статуса PulseAudio, которые вы можете просмотреть здесь .
Они решили использовать похожий на pactl
инструмент под названием pacmd
, который также входит в состав PulseAudio. Если вы взглянете на man pacmd
, вы обнаружите, что его можно «использовать для самоконтроля или перенастройки работающего звукового сервера PulseAudio во время выполнения»(man-страница pacmd). Этот «самоанализ» — это то, что нам здесь нужно.
pacmd list-sinks|grep -A 15 '* index'| awk '/volume: front/{ print $5 }' | sed 's/[%|,]//g'
Функция из репозитория немного более подробная в зависимости от среды:получить текущий объем
Вы также можете получить статус без звука :
pacmd list-sinks|grep -A 15 '* index'|awk '/muted:/{ print $2 }'
Посмотреть здесь:получить статус отключения звука
Это открывает множество возможностей для сценариев с libnotify
(, как это делает библиотека ), и печати нового уровня громкости или возможности реализации с помощью какого-либо другого хука, например воспроизведения звука при изменении громкости.
change-volume.sh
:
SINK=$(pacmd list-sinks|awk '/\* index:/{ print $3 }') || "@DEFAULT_SINK@"
pactl set-sink-volume "$SINK" "$@"
canberra-gtk-play -i audio-volume-change -d "$(basename "$0")"
. изменить -объем.ш +5%
На самом деле это может быть реализовано как часть команды pulseaudio pactl
в какой-то момент в будущем (, начиная с января 2021 года ). Неполный -список мест, где можно отслеживать прогресс:
pactl list sinks | tr ' ' '\n' | grep -m1 '%'
Или обрежьте процент с конца:
pactl list sinks | tr ' ' '\n' | grep -m1 '%' | tr -d '%'