diff --git a/CHANGELOG.md b/CHANGELOG.md index 97be1fb3..05e61048 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - #2663 allow to directly output json when logging (via log_type for JSON and --log-type via CLI) - #2675 fix path when installing language module like typescript - #2674 increase restart timeout for systemd startup +- #2564 allow to operate process (restart/reload/stop/delete) with regex ## 2.3.0 diff --git a/lib/API.js b/lib/API.js index bd590d27..6a927ef3 100644 --- a/lib/API.js +++ b/lib/API.js @@ -1309,6 +1309,30 @@ API.prototype._operate = function(action_name, process_name, envs, cb) { return processIds(ids, cb); }); } + // operate using regex + else if (isNaN(process_name) && process_name[0] === '/' && process_name[process_name.length - 1] === '/') { + var regex = new RegExp(process_name.replace(/\//g, '')); + + that.Client.executeRemote('getMonitorData', {}, function(err, list) { + if (err) { + Common.printError('Error retrieving process list: ' + err); + return cb(err); + } + var found_proc = []; + list.forEach(function(proc) { + if (regex.test(proc.pm2_env.name)) { + found_proc.push(proc.pm_id); + } + }); + + if (found_proc.length === 0) { + Common.printError(conf.PREFIX_MSG_WARNING + 'No process found'); + return cb ? cb(new Error('process name not found')) : that.exitCli(conf.ERROR_EXIT); + } + + return processIds(found_proc, cb); + }); + } else if (isNaN(process_name)) { /** * We can not stop or delete a module but we can restart it diff --git a/package.json b/package.json index 66f94570..058b7735 100644 --- a/package.json +++ b/package.json @@ -180,8 +180,7 @@ }, "devDependencies": { "mocha": "^3", - "should": "^11", - "better-assert": "^1.0.0" + "should": "^11" }, "optionalDependencies": { "gkt": "https://tgz.pm2.io/gkt-1.0.0.tgz" diff --git a/test/bash/operate-regex.sh b/test/bash/operate-regex.sh new file mode 100644 index 00000000..86e59fa8 --- /dev/null +++ b/test/bash/operate-regex.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +SRC=$(cd $(dirname "$0"); pwd) +source "${SRC}/include.sh" + +cd $file_path + +$pm2 start echo.js --name "echo-3" +$pm2 start echo.js --name "echo-1" +$pm2 start echo.js --name "echo-2" + +sleep 0.5 + +should 'should have started 3 apps' 'online' 3 + +$pm2 stop /echo-[1,2]/ + +should 'should have stopped 2 apps' 'stopped' 2 +should 'only one app should still be online' 'online' 1 + +$pm2 stop /echo-3/ +should 'should have stopped 1 apps' 'online' 0 + +$pm2 restart /echo-[1,2]/ + +should 'should have restarted 2 apps' 'online' 2 + diff --git a/test/pm2_behavior_tests.sh b/test/pm2_behavior_tests.sh index 9a59e530..418bf3bf 100644 --- a/test/pm2_behavior_tests.sh +++ b/test/pm2_behavior_tests.sh @@ -121,6 +121,8 @@ bash ./test/bash/log-null.sh spec "Logging path set to null" bash ./test/bash/log-json.sh spec "Logging directly to file in json" +bash ./test/bash/operate-regex.sh +spec "Operate process that match regex" # Issues related bash ./test/bash/issues/2337.sh diff --git a/test/programmatic/cluster.mocha.js b/test/programmatic/cluster.mocha.js index af855d87..6d6e6cdb 100644 --- a/test/programmatic/cluster.mocha.js +++ b/test/programmatic/cluster.mocha.js @@ -3,7 +3,6 @@ process.env.NODE_ENV = 'test'; var PM2 = require('../..'); var should = require('should'); -var assert = require('better-assert'); var path = require('path'); var Plan = require('../helpers/plan.js'); diff --git a/test/programmatic/env_switching.js b/test/programmatic/env_switching.js index ebb3164c..0f0c4309 100644 --- a/test/programmatic/env_switching.js +++ b/test/programmatic/env_switching.js @@ -5,7 +5,6 @@ var PM2 = require('../..'); var should = require('should'); -var assert = require('better-assert'); var path = require('path'); // Change to current folder diff --git a/test/programmatic/logs.js b/test/programmatic/logs.js index 7a66e86b..3859045e 100644 --- a/test/programmatic/logs.js +++ b/test/programmatic/logs.js @@ -5,7 +5,6 @@ process.env.NODE_ENV = 'test'; var PM2 = require('../..'); var should = require('should'); var fs = require('fs'); -var assert = require('better-assert'); var path = require('path'); describe('Max memory restart programmatic', function() { diff --git a/test/programmatic/max_memory_limit.js b/test/programmatic/max_memory_limit.js index 6564ac9f..efaf2a12 100644 --- a/test/programmatic/max_memory_limit.js +++ b/test/programmatic/max_memory_limit.js @@ -4,7 +4,6 @@ process.env.PM2_WORKER_INTERVAL = 1000; var PM2 = require('../..'); var should = require('should'); -var assert = require('better-assert'); var path = require('path'); // Change to current folder diff --git a/test/programmatic/misc_commands.js b/test/programmatic/misc_commands.js index 5fef9edd..b82c07f8 100644 --- a/test/programmatic/misc_commands.js +++ b/test/programmatic/misc_commands.js @@ -2,7 +2,6 @@ var PM2 = require('../..'); var should = require('should'); -var assert = require('better-assert'); var path = require('path'); describe('Misc commands', function() { diff --git a/test/programmatic/programmatic.js b/test/programmatic/programmatic.js index 74dbe57b..bf16fffc 100644 --- a/test/programmatic/programmatic.js +++ b/test/programmatic/programmatic.js @@ -6,7 +6,6 @@ //process.env.NODE_ENV ='test'; var PM2 = require('../..'); var should = require('should'); -var assert = require('better-assert'); var path = require('path'); describe('PM2 programmatic calls', function() { diff --git a/test/programmatic/send_data_process.mocha.js b/test/programmatic/send_data_process.mocha.js index 4fc092d5..378de0ee 100644 --- a/test/programmatic/send_data_process.mocha.js +++ b/test/programmatic/send_data_process.mocha.js @@ -6,7 +6,6 @@ var PM2 = require('../..'); var should = require('should'); -var assert = require('better-assert'); var path = require('path'); describe('PM2 programmatic calls', function() { diff --git a/test/programmatic/signals.js b/test/programmatic/signals.js index 558164f9..6c62c6ea 100644 --- a/test/programmatic/signals.js +++ b/test/programmatic/signals.js @@ -1,7 +1,6 @@ var PM2 = require('../..'); var should = require('should'); -var assert = require('better-assert'); var path = require('path'); describe('Signal kill (+delayed)', function() { diff --git a/test/programmatic/watcher.js b/test/programmatic/watcher.js index 0d97b01d..34cecc8e 100644 --- a/test/programmatic/watcher.js +++ b/test/programmatic/watcher.js @@ -1,5 +1,4 @@ -var should = require('should') -var assert = require('better-assert'); +var should = require('should'); var p = require('path'); var fs = require('fs') var EventEmitter = require('events').EventEmitter