сценарий Bash: подкаталог синтаксического анализа и не текущие каталоги

Похоже, что любой процесс, связывающийся с семейством разделяемых объектов libpulse* - либо до, либо после запуска X и оконного менеджера i3 - может неявно автозапустить сервер PulseAudio под вашим пользовательским процессом, как побочный продукт попыток взаимодействия с аудиоподсистемой. Создатель PulseAudio Леннарт Поттеринг, похоже, подтверждает это в письме от 2015-05-29 в списке рассылки systemd-devel:

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

"PA обычно запускается из скрипта или службы настройки сеанса. В Gnome это, например, gnome-session. Он также автоматически создается по требованию, если используются библиотеки и замечено их отсутствие."

Например, в Debian Stretch (Testing), веб-браузер IceWeasel ссылается на два разделяемых объекта libpulse*: 1) libpulsecommon-7.1.so; и 2) libpulse.so.0.18.2:

k@bucket:~$ ps -ef | grep iceweasel
k        17318     1  5 18:58 tty2     00:00:15 iceweasel
k        17498  1879  0 19:03 pts/0    00:00:00 grep iceweasel
k@bucket:~$ sudo pmap 17318 | grep -i pulse
00007fee08377000  65540K rw-s- pulse-shm-2442253193
00007fee0c378000  65540K rw-s- pulse-shm-3156287926
00007fee11d24000    500K r-x-- libpulsecommon-7.1.so
00007fee11da1000   2048K ----- libpulsecommon-7.1.so
00007fee11fa1000      4K r---- libpulsecommon-7.1.so
00007fee11fa2000      8K rw--- libpulsecommon-7.1.so
00007fee121af000    316K r-x-- libpulse.so.0.18.2
00007fee121fe000   2044K ----- libpulse.so.0.18.2
00007fee123fd000      4K r---- libpulse.so.0.18.2
00007fee123fe000      4K rw--- libpulse.so.0.18.2

Вы можете посмотреть, какие запущенные процессы ссылаются на libpulse*. Например, сначала получите список разделяемых объектов libpulse*, затем запустите lsof для каждого из них (примечание: это получено из Debian Stretch (Testing), поэтому ваш результат может отличаться):

sudo find / -type f -name "*libpulse*"
*snip*
/usr/lib/x86_64-linux-gnu/pulseaudio/libpulsedsp.so
/usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
/usr/lib/x86_64-linux-gnu/libpulse.so.0.18.2
/usr/lib/x86_64-linux-gnu/libpulse-simple.so.0.1.0
/usr/lib/x86_64-linux-gnu/libpulse-mainloop-glib.so.0.0.5
/usr/lib/libpulsecore-7.1.so
/usr/lib/ao/plugins-4/libpulse.so

sudo lsof /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
COMMAND     PID       USER  FD   TYPE DEVICE SIZE/OFF   NODE NAME
gnome-she   864 Debian-gdm mem    REG  252,1   524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
gnome-set   965 Debian-gdm mem    REG  252,1   524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
gnome-set  1232          k mem    REG  252,1   524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
gnome-she  1286          k mem    REG  252,1   524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
chrome     2730          k mem    REG  252,1   524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so
pulseaudi 18356          k mem    REG  252,1   524312 274980 /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-7.1.so

Чтобы запретить этим процессам автозапуск PulseAudio, отредактируйте ~/.config/pulse/client.conf и добавьте строку

autospawn = no

PulseAudio и его библиотеки уважают эту настройку, как правило.

Связывание libpulse* запущенными процессами может также указывать на то, почему PulseAudio перезапускается так быстро. Страница FreeDesktop.org, "Running PulseAudio", похоже, подтверждает это:

"...обычно какое-нибудь фоновое приложение немедленно переподключается, что приводит к немедленному перезапуску сервера."

Похоже, вы указываете, что запускаете оконный менеджер i3 через консоль (выполнив xinit) и не используете диспетчер дисплеев или среду рабочего стола. Остальная часть этого ответа содержит подробную информацию для тех, кто использует GNOME, KDE и т.д.

ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ, ДЛЯ АВТОСТАРТА GNOME/KDE

Пакет PulseAudio (5.0-13), в Debian Jessie (Stable) amd64, устанавливает следующие четыре системных файла:

  1. /etc/xdg/autostart/pulseaudio-kde. desktop
  2. /etc/xdg/autostart/pulseaudio.desktop
  3. /usr/bin/start-pulseaudio-x11
  4. /usr/bin/start-pulseaudio-kde

Некоторые графические менеджеры сессий автоматически запускают FreeDesktop.org скрипты автозапуска при входе пользователя в систему. Сценарий автозапуска PulseAudio, в свою очередь, указывает менеджерам графических сессий запустить соответствующий сценарий запуска PulseAudio:

/usr/bin/start-pulseaudio-x11
/usr/bin/start-pulseaudio-kde

Эти сценарии вызывают клиента PulseAudio /usr/bin/pactl для загрузки модулей PulseAudio, который порождает сервер PulseAudio в качестве побочного продукта (примечание: если у вас autospawn установлен на "no", pactl уважает это и не будет автозапускать сервер PulseAudio).

Более подробно на странице FreeDesktop.org "Запуск PulseAudio".

Некоторые менеджеры дисплеев, в дополнение и в других дистрибутивах, могут запускать PulseAudio (например, SDDM, на ArchLinux. Хотя мейнтейнеры, возможно, уже решили эту проблему).

0
05.09.2018, 05:22
2 ответа

Разбиение на пробелы происходит в вашей команде read, но вам это все равно не нужно. Кроме того, ваша ifлогика ошибочна. Это будет работать, только если my_dirравно ., иначе findне будет генерировать .на выходе. Наконец, вы указываете в своем примере, что вам нужны только имена каталогов, а не весь путь, но так, как вы его написали, findпередаст путь к стандартному выводу.

Вот более простое решение:

find "$my_dir" -maxdepth 1 -type d -exec basename {} \;|tail -n +2

Хитрость здесь заключается в команде tail. Вы хотите исключить начальный каталог($my_dir)из вывода.findвсегда сначала выводит этот каталог (, если вы явно не требуете глубины -первого обхода ), поэтому вам просто нужно удалить первую строку из результирующего вывода.

0
28.01.2020, 04:13

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

find "$my_dir" -mindepth 1 -maxdepth 1 -type d -print0

Однако, поскольку у вас также есть -maxdepthограничение глубины, почему бы просто не использовать forцикл

for dir in "$my_dir"/*
do
    [[ -d "$dir" ]] || continue    # only directories
    echo "${dir/*\/}"              # just basename
done
0
28.01.2020, 04:13

Теги

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