Приложение Node, работающее с PM2, не останавливается, когда процесс останавливается

Я заметил, что приложения, запущенные с помощью PM2, продолжают работать даже после того, как процессы были остановлены или удалены. Это происходит не всегда, особенно если процесс только что запущен, но если его оставить на какое-то время, это произойдет всегда.

Я начинаю свой процесс с:

pm2 start npm --name "next" -- start

Это работает по назначению.

Однако, если я вернусь к нему через пару дней и запущу:

pm2 stop next

Процесс будет остановлен и исчезнет из вывода pm2 ls. К сожалению, само приложение все еще работает в фоновом режиме, и единственный способ, который я нашел, чтобы остановить его, — это полная перезагрузка моего сервера, что не является оптимальным.

Моя проблема аналогична упомянутой здесь, но мне это решение не помогло.

Выход ps aux || grep node:

ps aux || grep "node"
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.5 225444  5868 ?        Ss   Sep09   1:42 /lib/systemd/systemd --system --deserialize 38
root         2  0.0  0.0      0     0 ?        S    Sep09   0:00 [kthreadd]
root         4  0.0  0.0      0     0 ?        I<   Sep09   0:00 [kworker/0:0H]
root         6  0.0  0.0      0     0 ?        I<   Sep09   0:00 [mm_percpu_wq]
root         7  0.0  0.0      0     0 ?        S    Sep09   0:33 [ksoftirqd/0]
root         8  0.0  0.0      0     0 ?        I    Sep09   2:47 [rcu_sched]
root         9  0.0  0.0      0     0 ?        I    Sep09   0:00 [rcu_bh]
root        10  0.0  0.0      0     0 ?        S    Sep09   0:00 [migration/0]
root        11  0.0  0.0      0     0 ?        S    Sep09   0:10 [watchdog/0]
root        12  0.0  0.0      0     0 ?        S    Sep09   0:00 [cpuhp/0]
root        13  0.0  0.0      0     0 ?        S    Sep09   0:00 [kdevtmpfs]
root        14  0.0  0.0      0     0 ?        I<   Sep09   0:00 [netns]
root        15  0.0  0.0      0     0 ?        S    Sep09   0:00 [rcu_tasks_kthre]
root        16  0.0  0.0      0     0 ?        S    Sep09   0:00 [kauditd]
root        17  0.0  0.0      0     0 ?        S    Sep09   0:01 [khungtaskd]
root        18  0.0  0.0      0     0 ?        S    Sep09   0:00 [oom_reaper]
root        19  0.0  0.0      0     0 ?        I<   Sep09   0:00 [writeback]
root        20  0.0  0.0      0     0 ?        S    Sep09   0:00 [kcompactd0]
root        21  0.0  0.0      0     0 ?        SN   Sep09   0:00 [ksmd]
root        22  0.0  0.0      0     0 ?        SN   Sep09   0:00 [khugepaged]
root        23  0.0  0.0      0     0 ?        I<   Sep09   0:00 [crypto]
root        24  0.0  0.0      0     0 ?        I<   Sep09   0:00 [kintegrityd]
root        25  0.0  0.0      0     0 ?        I<   Sep09   0:00 [kblockd]
root        26  0.0  0.0      0     0 ?        I<   Sep09   0:00 [ata_sff]
root        27  0.0  0.0      0     0 ?        I<   Sep09   0:00 [md]
root        28  0.0  0.0      0     0 ?        I<   Sep09   0:00 [edac-poller]
root        29  0.0  0.0      0     0 ?        I<   Sep09   0:00 [devfreq_wq]
root        30  0.0  0.0      0     0 ?        I<   Sep09   0:00 [watchdogd]
root        34  0.0  0.0      0     0 ?        S    Sep09  21:32 [kswapd0]
root        35  0.0  0.0      0     0 ?        I<   Sep09   0:00 [kworker/u3:0]
root        36  0.0  0.0      0     0 ?        S    Sep09   0:00 [ecryptfs-kthrea]
root        78  0.0  0.0      0     0 ?        I<   Sep09   0:00 [kthrotld]
root        79  0.0  0.0      0     0 ?        I<   Sep09   0:00 [acpi_thermal_pm]
root        80  0.0  0.0      0     0 ?        S    Sep09   0:00 [scsi_eh_0]
root        81  0.0  0.0      0     0 ?        I<   Sep09   0:00 [scsi_tmf_0]
root        82  0.0  0.0      0     0 ?        S    Sep09   0:00 [scsi_eh_1]
root        83  0.0  0.0      0     0 ?        I<   Sep09   0:00 [scsi_tmf_1]
root        89  0.0  0.0      0     0 ?        I<   Sep09   0:00 [ipv6_addrconf]
root        98  0.0  0.0      0     0 ?        I<   Sep09   0:00 [kstrp]
root       115  0.0  0.0      0     0 ?        I<   Sep09   0:00 [charger_manager]
root       153  0.0  0.0      0     0 ?        S    Sep09   0:00 [scsi_eh_2]
root       154  0.0  0.0      0     0 ?        I<   Sep09   0:00 [scsi_tmf_2]
root       155  0.0  0.0      0     0 ?        I<   Sep09   0:58 [kworker/0:1H]
root       266  0.0  0.0      0     0 ?        I<   Sep09   0:00 [raid5wq]
root       318  0.0  0.0      0     0 ?        S    Sep09   0:54 [jbd2/vda1-8]
root       319  0.0  0.0      0     0 ?        I<   Sep09   0:00 [ext4-rsv-conver]
root       404  0.0  0.0      0     0 ?        I<   Sep09   0:00 [iscsi_eh]
root       408  0.0  0.0 105904   228 ?        Ss   Sep09   0:00 /sbin/lvmetad -f
root       413  0.0  0.0      0     0 ?        I<   Sep09   0:00 [ib-comp-wq]
root       414  0.0  0.0      0     0 ?        I<   Sep09   0:00 [ib_mcast]
root       415  0.0  0.0      0     0 ?        I<   Sep09   0:00 [ib_nl_sa_wq]
root       417  0.0  0.0      0     0 ?        I<   Sep09   0:00 [rdma_cm]
root       698  0.0  0.9 501844  9800 ?        Ss   Sep18   1:46 /usr/sbin/apache2 -k start
root       842  0.0  0.1 652392  1420 ?        Ssl  Sep09   0:18 /usr/bin/lxcfs /var/lib/lxcfs/
root       843  0.0  0.4  71488  4416 ?        Ss   Sep09   0:05 /lib/systemd/systemd-logind
root       848  0.0  0.7 187700  7924 ?        Ssl  Sep09   0:00 /usr/bin/python3 /usr/share/unattended-upgrades/unattended-upgrade-shutdown --wait-for-signal
root       854  0.0  0.1 287992  1416 ?        Ssl  Sep09   2:48 /usr/lib/accountsservice/accounts-daemon
root       856  0.0  0.1  31748  1240 ?        Ss   Sep09   0:07 /usr/sbin/cron -f
syslog     861  0.0  0.1 263036  1776 ?        Ssl  Sep09   1:51 /usr/sbin/rsyslogd -n
root       864  0.0  0.7 170876  7808 ?        Ssl  Sep09   0:00 /usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers
message+   865  0.0  0.3  50280  3092 ?        Ss   Sep09   2:10 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
daemon     891  0.0  0.0  28332   212 ?        Ss   Sep09   0:00 /usr/sbin/atd -f
root       895  0.0  0.2  72296  2068 ?        Ss   Sep09   2:17 /usr/sbin/sshd -D
root       903  0.0  0.0  16412   140 ttyS0    Ss+  Sep09   0:00 /sbin/agetty -o -p -- \u --keep-baud 115200,38400,9600 ttyS0 vt220
root       907  0.0  0.1 288880  1524 ?        Ssl  Sep09   1:11 /usr/lib/policykit-1/polkitd --no-debug
root       908  0.0  0.0  14888   136 tty1     Ss+  Sep09   0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
mysql      943  0.1 20.6 1161772 208636 ?      Sl   Sep09  68:26 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
leonardo  1068  0.0  0.1  76636  1028 ?        Ss   Sep09   0:00 /lib/systemd/systemd --user
leonardo  1072  0.0  0.2 111788  2388 ?        S    Sep09   0:00 (sd-pam)
root      6750  0.0  0.0      0     0 ?        I    Oct12   0:01 [kworker/0:1]
root     13084  0.0  0.0  42904   820 ?        Ss   Sep12   0:30 /lib/systemd/systemd-udevd
leonardo 16084  0.0  0.0   4632    72 ?        S    11:26   0:00 sh -c NODE_PATH=. NODE_ENV=production node server.js
leonardo 16085  0.0  9.0 1303708 90912 ?       Sl   11:26   0:05 node server.js
www-data 16095  0.0  6.5 592644 65988 ?        S    11:26   0:02 /usr/sbin/apache2 -k start
www-data 16096  0.0  6.1 512560 62084 ?        S    11:26   0:01 /usr/sbin/apache2 -k start
root     16993  0.0  0.0 105692   996 ?        Ss   12:39   0:00 sshd: leonardo [priv]
leonardo 17093  0.0  0.0 107992  1008 ?        S    12:39   0:00 sshd: leonardo@pts/1
leonardo 17094  0.0  0.1  23204  1716 pts/1    Ss+  12:39   0:00 -bash
systemd+ 17556  0.0  0.0  71848   724 ?        Ss   Sep12   0:03 /lib/systemd/systemd-networkd
systemd+ 17571  0.0  0.1  70756  1872 ?        Ss   Sep12   1:13 /lib/systemd/systemd-resolved
systemd+ 17585  0.0  0.0 141928   596 ?        Ssl  Sep12   0:04 /lib/systemd/systemd-timesyncd
root     17604  0.0  4.3 184004 43936 ?        S<s  Sep12   7:58 /lib/systemd/systemd-journald
root     18184  0.0  0.0      0     0 ?        I    14:11   0:00 [kworker/0:0]
leonardo 18215  0.0  4.4 966088 44652 ?        Ssl  14:12   0:01 PM2 v3.5.1: God Daemon (/home/leonardo/.pm2)
www-data 18227  0.0  5.7 590632 58468 ?        S    14:12   0:00 /usr/sbin/apache2 -k start
www-data 18231  0.0  4.6 511832 46832 ?        S    14:12   0:00 /usr/sbin/apache2 -k start
www-data 18232  0.0  2.0 504524 20264 ?        S    14:12   0:00 /usr/sbin/apache2 -k start
root     18261  0.0  0.0      0     0 ?        I    14:14   0:00 [kworker/u2:1]
root     18311  0.0  0.0      0     0 ?        I    14:19   0:00 [kworker/u2:0]
www-data 18368  0.0  3.6 505148 37244 ?        S    14:26   0:00 /usr/sbin/apache2 -k start
root     18438  0.0  0.0      0     0 ?        I    14:35   0:00 [kworker/u2:2]
www-data 18441  0.0  1.9 504244 19308 ?        S    14:35   0:00 /usr/sbin/apache2 -k start
www-data 18442  0.0  1.9 504244 19308 ?        S    14:35   0:00 /usr/sbin/apache2 -k start
www-data 18443  0.0  1.9 504244 19308 ?        S    14:35   0:00 /usr/sbin/apache2 -k start
www-data 18445  0.0  1.9 504304 19440 ?        S    14:35   0:00 /usr/sbin/apache2 -k start
root     18458  0.0  0.7 105684  7216 ?        Ss   14:36   0:00 sshd: leonardo [priv]
leonardo 18538  0.0  0.5 107984  5504 ?        S    14:36   0:00 sshd: leonardo@pts/0
leonardo 18539  0.1  0.5  23204  5144 pts/0    Ss   14:36   0:00 -bash
leonardo 18558  0.0  0.3  40092  3460 pts/0    R+   14:37   0:00 ps aux
root     24135  0.0  0.0      0     0 ?        I<   Sep12   0:00 [xfsalloc]
root     24136  0.0  0.0      0     0 ?        I<   Sep12   0:00 [xfs_mru_cache]
do-agent 28788  0.0  1.3 496372 14064 ?        Ssl  Sep14   5:51 /opt/digitalocean/bin/do-agent --syslog

My server.js:

const express = require( 'express' )
const axios = require( 'axios' )
const next    = require( 'next' )
const cacheableResponse = require('cacheable-response')

// Import middleware.
const routes = require( './routes' )

// Setup app.
const app     = next( { dev: 'production' !== process.env.NODE_ENV } )
const handle  = app.getRequestHandler()
const handler = routes.getRequestHandler( app )

const ssrCache = cacheableResponse({
  ttl: 1000 * 60 * 60, // 1hour
  get: async ({ req, res, pagePath, queryParams }) => ({
    data: await app.renderToHTML(req, res, pagePath, queryParams)
  }),
  send: ({ data, res }) => res.send(data)
})

app.prepare()
  .then( () => {

    // Create server.
    const server = express();

    // Use our handler for requests.
    server.use( handler );

    // Don't remove. Important for the server to work. Default route.
    server.get( '*', ( req, res ) => {
      ssrCache({ req, res })
    } );

    // Get current port.
    const port = process.env.PORT || 8080;

    // Error check.
    server.listen( port, err => {
      if ( err ) {
        throw err;
      }

      // Where we starting, yo!
      console.log( `> Ready on port ${port}...` );
    } );
  } );

person Eight    schedule 13.10.2019    source источник


Ответы (1)


Это может произойти по нескольким причинам. Пожалуйста, проверьте, не запускает ли само приложение какой-либо демон изнутри. Что вы видите, когда запускаете ps aux || grep node. Если вы можете опубликовать здесь свой app.js или server.js или index.js или что-то еще, что действует как основной файл вашего файла приложения, это поможет диагностировать проблему.

если вы устанавливаете какую-либо переменную среды, такую ​​​​как производство, вы можете сделать это явно, т.е. export NODE_ENV=production

Вы можете запустить приложение server.js без npm с помощью pm2 с помощью приведенной ниже команды pm2 start server.js -- --prod Это должно работать без проблем.

Для чего-то большего я бы рекомендовал файл конфигурации pm2, это правильный способ использования скриптов pm2.

person Jeet    schedule 13.10.2019
comment
Добавил оба в ОП. Не уверен, что я ищу в ps aux, похоже, нет ничего, что напрямую связано с узлом, но я могу ошибаться. - person Eight; 13.10.2019
comment
leonardo 16085 0.0 9.0 1303708 90912 ? Sl 11:26 0:05 node server.js это процесс вашего узла. можете ли вы остановить pm2 и посмотреть, присутствует ли он еще в ps aux. - person Jeet; 13.10.2019
comment
Да, это все еще там, даже после остановки. Есть ли способ автоматически остановить это, когда я остановлю pm2? - person Eight; 13.10.2019
comment
Это запустило его, но в режиме разработки. Моя текущая команда запуска — NODE_PATH=. NODE_ENV=production node server.js, как мне ее использовать с pm2? - person Eight; 13.10.2019
comment
Не могли бы вы уточнить, где использовать export NODE_ENG=production? Запуск pm2 start server.js -- --prod запустил его в режиме разработки. В настоящее время ищу файлы конфигурации, спасибо за помощь. - person Eight; 13.10.2019
comment
Запустите команду export NODE_ENV=production непосредственно перед pm2 start server.js -- --prod или pm2 start server.js -- --production в зависимости от того, что ищет файл вашего приложения для определения среды. - person Jeet; 13.10.2019
comment
Это сработало! Я буду больше изучать конфигурацию pm2, так как она кажется намного проще в использовании! Спасибо за помощь! - person Eight; 13.10.2019