Search code examples
javascriptangularpm2aws-codepipelineaws-code-deploy

application_stop.sh: line 4: pm2: command not found


In my ec2 instance I am able to run pm2 command.

enter image description here

But while deploying application through code deployment I get this error.

enter image description here

LifecycleEvent - ApplicationStop Script - application_stop.sh [stdout]Stopping any existing node servers [stderr]/opt/codedeploy-agent/deployment-root/878477e5-6ffb-4175-8e9e-97045ea99290/d-HVRQ58IBL/deployment-archive/application_stop.sh: line 4: pm2: command not found

My application_stop.sh code.

#!/bin/bash
#Stopping existing node servers
echo "Stopping any existing node servers"
pm2 stop main

As per @ranjanistic I checked my pm2 path using which pm2 command and it returned

~/.nvm/versions/node/v16.15.1/bin/pm2

After that I update my application_stop.sh using this below command

~/.nvm/versions/node/v16.15.1/bin/pm2 start main

Also added symbolic link like this to npm, node and pm2.

///this process worked. Thanks @ranjanistic

which npm
which node
which pm2

sudo ln -s /home/ec2-user/.nvm/versions/node/v16.15.1/bin/npm
sudo ln -s /home/ec2-user/.nvm/versions/node/v16.15.1/bin/node
sudo ln -s /home/ec2-user/.nvm/versions/node/v16.15.1/bin/pm2

Still not working


Solution

  • The binary executable reference to your command needs to be available in the environment you're expecting to run it from.

    You are using npm to run a pm2 command, which means it is installed as a local module. Therefore you can similarly create another npm script like npm run stop:all with your pm2 command, it should work.

    If you're running it in a bash script, the command reference binary should be available in PATH. Or you can also use your command by mentioning its binary path instead of name, independent of wherever the binary is located, for example

    If pm2 is installed as a global node module

    /usr/bin/pm2 stop main # or whatever the path to the binary is.
    

    Or if pm2 is installed as a node module in project then

    ./node_modules/bin/pm2 stop main # again, path to pm2 binary can be anything, you'll have to know beforehand
    

    Also, I'd recommend a separate config file for each of your pm2 applications, so that you can use it anywhere without worrying whether your main app is available to pm2 or not.

    You may also need to check if npm or node commands are running or not, and based on that you may add the path to your folder containing pm2 in $PATH variable before running the deployment. You can check the path to pm2 manually using which pm2 if it is available.