В обычной Ubuntu я обычно создавал каталог для сокетов Unix следующим образом (например, для проекта foo
):
- Создайте скрипт systemd в:
/usr/lib/tmpfiles.d/foo.conf
- Поместите в скрипт следующий код:
/run/foo 0770 <username> <groupname>
Затем при следующей перезагрузке каталог /run/foo
будет создан с требуемыми разрешениями. Причина, по которой я это делаю, заключается в том, что только root может писать в /var/run
which links to -> /run
, и для многих приложений характерно сбрасывать привилегии и менять пользователя перед созданием сокета, и поэтому они не могут писать в /var/run
.
Теперь я использую WSL2 с Ubuntu 20.04, и systemd
не существует. Можно прыгнуть через много обручей, чтобы заставить его работать, но они глючат.
Как создать папку с нужными разрешениями, которая очищается после перезагрузки, прежде чем какое-либо из установленных приложений (например, nginx/postgresql) попытается создать свои сокеты (и, следовательно, потерпит неудачу из-за устаревших сокетов до перезагрузки)?
решение1
Вместо служб init.d вам может повезти, если вы запишете полный путь к своему скрипту в файл с именем /etc/rc.local
(вам, возможно, придется создать его) и сделаете его исполняемым
Вот так:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
## Examples:
/usr/bin/foo # a program
/usr/local/bin/bar.sh # a shell script
/etc/init.d/foobar start # a service
exit 0
Это exit 0
важно!
Затем сделайте его исполняемым:
chmod +x /etc/rc.local
Все там будет запущено каккореньпри загрузке системы.
rc.local на самом деле устарел, так как1983иможет больше не работать. Когда была представлена новая, а теперь устаревшая система SysV-Init, она служила обходным путем для сохранения еще более старых методов инициализации системы, и ее больше не рекомендуется использовать.