Expo: Packager останавливается через несколько секунд после старта
Dec 11, 2017 11:39 · 438 words · 3 minute read
При запуске проекта при помощи команды exp
через несколько секунд после старта React Native packager отваливается без каких-либо сообщений в логах. Давайте разберемся!
Сразу после запуска команды exp start --tunnel --send-to ealebed@gmail.com
в консоли можно увидеть следующее:
[exp] Starting React Native packager...
[exp] Scanning folders for symlinks in /var/www/mobile/node_modules (19ms)
[exp] Loading dependency graph.
[exp] Running packager on port 19001.
[exp] Expo is ready.
[exp] You can scan this QR code:
< Qr code >
[exp] Your URL is: exp://< my random url >.mobile.exp.direct:80
[exp] Sending URL to ealebed@gmail.com
[exp] Sent.
[exp] Logs for your project will appear below. Press Ctrl+C to exit.
В этот момент можно «засечь» порт, на котором запускается React Native packager (19001):
netstat -napl | grep 1900
tcp6 0 0 :::19000 :::* LISTEN 10899/node
tcp6 0 0 127.0.0.1:19001 127.0.0.1:45950 TIME_WAIT -
tcp6 0 0 127.0.0.1:19000 127.0.0.1:38556 TIME_WAIT -
Но спустя несколько секунд он пропадает:
netstat -napl | grep 1900
tcp6 0 0 :::19000 :::* LISTEN 10899/node
Ситуация повторяется и при запуске exp в docker-контейнере, и при запуске непосредственно с хост-машины. Мы знаем, что LISTEN использует inotify
по умолчанию для отслеживания изменений в файлах и каталогах Linux. Иногда происходит ситуация, когда можно «упереться» в лимит количества файлов, за которыми ведется наблюдение — в таком случае его необходимо увеличить.
У inotify
есть три параметра (ls /proc/sys/fs/inotify/
), на которые мы можем повлиять:
max_queued_events
— максимальное число событий в очереди (default = 16384);max_user_instances
— сколько инстансовinotify
может запустить один пользователь (default = 128);max_user_watches
— сколько файлов может отслеживать один пользоваль (default = 8192).
Проверим значение этих параметров на хост-машине:
sysctl -a | grep fs.inotify
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
Очевидно, что внутри docker-контейнера значения будут такими же:
docker exec -it node-expo sysctl -a | grep fs.inotify
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 8192
Увеличиваем значения параметра fs.inotify.max_user_watches
на хост-машине:
echo fs.inotify.max_user_watches = 524288 | sudo tee -a /etc/sysctl.conf && sudo sysctl -p
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_watches = 524288
Проверим, изменилось ли значение внутри docker-контейнера:
docker exec -it node-expo sysctl -a | grep fs.inotify
fs.inotify.max_queued_events = 16384
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 524288
Запускаем exp
в docker-контейнере, через несколько секунд проверяем открытые порты на хост-машине:
netstat -napl | grep 1900
tcp 0 0 127.0.0.1:34540 127.0.0.1:19000 ESTABLISHED 19602/ngrok
tcp 0 0 127.0.0.1:42368 127.0.0.1:19001 ESTABLISHED 19602/ngrok
tcp6 0 0 :::19000 :::* LISTEN 19473/node
tcp6 0 0 :::19001 :::* LISTEN 19540/node
tcp6 0 0 127.0.0.1:19000 127.0.0.1:34540 ESTABLISHED 19473/node
tcp6 0 0 127.0.0.1:19000 127.0.0.1:33104 TIME_WAIT -
tcp6 0 0 127.0.0.1:19001 127.0.0.1:42368 ESTABLISHED 19540/node
tcp6 0 0 127.0.0.1:19001 127.0.0.1:40498 TIME_WAIT -
После внесенных изменений React Native packager больше не отваливается и все работает, как ожидалось.