в tips, ubuntu

Expo: Packager останавливается через несколько секунд после старта


При запуске проекта при помощи команды 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 больше не отваливается и все работает, как ожидалось.

Добавить комментарий