Похоже, что любой процесс, связывающийся с семейством разделяемых объектов 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, устанавливает следующие четыре системных файла:
Некоторые графические менеджеры сессий автоматически запускают 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. Хотя мейнтейнеры, возможно, уже решили эту проблему).
Разбиение на пробелы происходит в вашей команде read
, но вам это все равно не нужно. Кроме того, ваша if
логика ошибочна. Это будет работать, только если my_dir
равно .
, иначе find
не будет генерировать .
на выходе. Наконец, вы указываете в своем примере, что вам нужны только имена каталогов, а не весь путь, но так, как вы его написали, find
передаст путь к стандартному выводу.
Вот более простое решение:
find "$my_dir" -maxdepth 1 -type d -exec basename {} \;|tail -n +2
Хитрость здесь заключается в команде tail
. Вы хотите исключить начальный каталог($my_dir
)из вывода.find
всегда сначала выводит этот каталог (, если вы явно не требуете глубины -первого обхода ), поэтому вам просто нужно удалить первую строку из результирующего вывода.
Если он у вас есть, используйте параметр -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