PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/lib/node_modules/pm2/lib/binaries
Viewing File: /usr/lib/node_modules/pm2/lib/binaries/CLI.js
'use strict'; process.env.PM2_USAGE = 'CLI'; var cst = require('../../constants.js'); var commander = require('commander'); var chalk = require('ansis'); var forEachLimit = require('async/forEachLimit'); var debug = require('debug')('pm2:cli'); var PM2 = require('../API.js'); var pkg = require('../../package.json'); var tabtab = require('../completion.js'); var Common = require('../Common.js'); var PM2ioHandler = require('../API/pm2-plus/PM2IO'); var semver = require('semver') if (cst.IS_BUN === true && semver.lt(process.versions.bun, '1.1.25')) { throw new Error('PM2 cannot run on Bun version < 1.1.25 (cluster support)') } Common.determineSilentCLI(); Common.printVersion(); var pm2 = new PM2(); PM2ioHandler.usePM2Client(pm2) commander.version(pkg.version) .option('-v --version', 'print pm2 version') .option('-s --silent', 'hide all messages', false) .option('--ext <extensions>', 'watch only this file extensions') .option('-n --name <name>', 'set a name for the process in the process list') .option('-m --mini-list', 'display a compacted list without formatting') .option('--interpreter <interpreter>', 'set a specific interpreter to use for executing app, default: node') .option('--interpreter-args <arguments>', 'set arguments to pass to the interpreter (alias of --node-args)') .option('--node-args <node_args>', 'space delimited arguments to pass to node') .option('-o --output <path>', 'specify log file for stdout') .option('-e --error <path>', 'specify log file for stderr') .option('-l --log [path]', 'specify log file which gathers both stdout and stderr') .option('--filter-env [envs]', 'filter out outgoing global values that contain provided strings', function(v, m) { m.push(v); return m;}, []) .option('--log-type <type>', 'specify log output style (raw by default, json optional)') .option('--log-date-format <date format>', 'add custom prefix timestamp to logs') .option('--time', 'enable time logging') .option('--disable-logs', 'disable all logs storage') .option('--env <environment_name>', 'specify which set of environment variables from ecosystem file must be injected') .option('-a --update-env', 'force an update of the environment with restart/reload (-a <=> apply)') .option('-f --force', 'force actions') .option('-i --instances <number>', 'launch [number] instances (for networked app)(load balanced)') .option('--parallel <number>', 'number of parallel actions (for restart/reload)') .option('--shutdown-with-message', 'shutdown an application with process.send(\'shutdown\') instead of process.kill(pid, SIGINT)') .option('-p --pid <pid>', 'specify pid file') .option('-k --kill-timeout <delay>', 'delay before sending final SIGKILL signal to process') .option('--listen-timeout <delay>', 'listen timeout on application reload') .option('--max-memory-restart <memory>', 'Restart the app if an amount of memory is exceeded (in bytes)') .option('--restart-delay <delay>', 'specify a delay between restarts (in milliseconds)') .option('--exp-backoff-restart-delay <delay>', 'specify a delay between restarts (in milliseconds)') .option('-x --execute-command', 'execute a program using fork system') .option('--max-restarts [count]', 'only restart the script COUNT times') .option('-u --user <username>', 'define user when generating startup script') .option('--uid <uid>', 'run target script with <uid> rights') .option('--gid <gid>', 'run target script with <gid> rights') .option('--namespace <ns>', 'start application within specified namespace') .option('--cwd <path>', 'run target script from path <cwd>') .option('--hp <home path>', 'define home path when generating startup script') .option('--wait-ip', 'override systemd script to wait for full internet connectivity to launch pm2') .option('--service-name <name>', 'define service name when generating startup script') .option('-c --cron <cron_pattern>', 'restart a running process based on a cron pattern') .option('-c --cron-restart <cron_pattern>', '(alias) restart a running process based on a cron pattern') .option('-w --write', 'write configuration in local folder') .option('--no-daemon', 'run pm2 daemon in the foreground if it doesn\'t exist already') .option('--source-map-support', 'force source map support') .option('--only <application-name>', 'with json declaration, allow to only act on one application') .option('--disable-source-map-support', 'force source map support') .option('--wait-ready', 'ask pm2 to wait for ready event from your app') .option('--merge-logs', 'merge logs from different instances but keep error and out separated') .option('--watch [paths]', 'watch application folder for changes', function(v, m) { m.push(v); return m;}, []) .option('--ignore-watch <folders|files>', 'List of paths to ignore (name or regex)') .option('--watch-delay <delay>', 'specify a restart delay after changing files (--watch-delay 4 (in sec) or 4000ms)') .option('--no-color', 'skip colors') .option('--no-vizion', 'start an app without vizion feature (versioning control)') .option('--no-autostart', 'add an app without automatic start') .option('--no-autorestart', 'start an app without automatic restart') .option('--stop-exit-codes <exit_codes...>', 'specify a list of exit codes that should skip automatic restart') .option('--no-treekill', 'Only kill the main process, not detached children') .option('--no-pmx', 'start an app without pmx') .option('--no-automation', 'start an app without pmx') .option('--trace', 'enable transaction tracing with km') .option('--disable-trace', 'disable transaction tracing with km') .option('--sort <field_name:sort>', 'sort process according to field\'s name') .option('--attach', 'attach logging after your start/restart/stop/reload') .option('--v8', 'enable v8 data collecting') .option('--event-loop-inspector', 'enable event-loop-inspector dump in pmx') .option('--deep-monitoring', 'enable all monitoring tools (equivalent to --v8 --event-loop-inspector --trace)') .usage('[cmd] app'); function displayUsage() { console.log('usage: pm2 [options] <command>') console.log(''); console.log('pm2 -h, --help all available commands and options'); console.log('pm2 examples display pm2 usage examples'); console.log('pm2 <command> -h help on a specific command'); console.log(''); console.log('Access pm2 files in ~/.pm2'); } function displayExamples() { console.log('- Start and add a process to the pm2 process list:') console.log(''); console.log(chalk.cyan(' $ pm2 start app.js --name app')); console.log(''); console.log('- Show the process list:'); console.log(''); console.log(chalk.cyan(' $ pm2 ls')); console.log(''); console.log('- Stop and delete a process from the pm2 process list:'); console.log(''); console.log(chalk.cyan(' $ pm2 delete app')); console.log(''); console.log('- Stop, start and restart a process from the process list:'); console.log(''); console.log(chalk.cyan(' $ pm2 stop app')); console.log(chalk.cyan(' $ pm2 start app')); console.log(chalk.cyan(' $ pm2 restart app')); console.log(''); console.log('- Clusterize an app to all CPU cores available:'); console.log(''); console.log(chalk.cyan(' $ pm2 start -i max')); console.log(''); console.log('- Update pm2 :'); console.log(''); console.log(chalk.cyan(' $ npm install pm2 -g && pm2 update')); console.log(''); console.log('- Install pm2 auto completion:') console.log(''); console.log(chalk.cyan(' $ pm2 completion install')) console.log(''); console.log('Check the full documentation on https://pm2.keymetrics.io/'); console.log(''); } function beginCommandProcessing() { pm2.getVersion(function(err, remote_version) { if (!err && (pkg.version != remote_version)) { console.log(''); console.log(chalk.red.bold('>>>> In-memory PM2 is out-of-date, do:\n>>>> $ pm2 update')); console.log('In memory PM2 version:', chalk.blue.bold(remote_version)); console.log('Local PM2 version:', chalk.blue.bold(pkg.version)); console.log(''); } }); commander.parse(process.argv); } function checkCompletion(){ return tabtab.complete('pm2', function(err, data) { if(err || !data) return; if(/^--\w?/.test(data.last)) return tabtab.log(commander.options.map(function (data) { return data.long; }), data); if(/^-\w?/.test(data.last)) return tabtab.log(commander.options.map(function (data) { return data.short; }), data); // array containing commands after which process name should be listed var cmdProcess = ['stop', 'restart', 'scale', 'reload', 'delete', 'reset', 'pull', 'forward', 'backward', 'logs', 'describe', 'desc', 'show']; if (cmdProcess.indexOf(data.prev) > -1) { pm2.list(function(err, list){ tabtab.log(list.map(function(el){ return el.name }), data); pm2.disconnect(); }); } else if (data.prev == 'pm2') { tabtab.log(commander.commands.map(function (data) { return data._name; }), data); pm2.disconnect(); } else pm2.disconnect(); }); }; var _arr = process.argv.indexOf('--') > -1 ? process.argv.slice(0, process.argv.indexOf('--')) : process.argv; if (_arr.indexOf('log') > -1) { process.argv[_arr.indexOf('log')] = 'logs'; } if (_arr.indexOf('--no-daemon') > -1) { // // Start daemon if it does not exist // // Function checks if --no-daemon option is present, // and starts daemon in the same process if it does not exist // console.log('pm2 launched in no-daemon mode (you can add DEBUG="*" env variable to get more messages)'); var pm2NoDaeamon = new PM2({ daemon_mode : false }); pm2NoDaeamon.connect(function() { pm2 = pm2NoDaeamon; beginCommandProcessing(); }); } else if (_arr.indexOf('startup') > -1 || _arr.indexOf('unstartup') > -1) { setTimeout(function() { commander.parse(process.argv); }, 100); } else { // HERE we instanciate the Client object pm2.connect(function() { debug('Now connected to daemon'); if (process.argv.slice(2)[0] === 'completion') { checkCompletion(); //Close client if completion related installation var third = process.argv.slice(3)[0]; if ( third == null || third === 'install' || third === 'uninstall') pm2.disconnect(); } else { beginCommandProcessing(); } }); } // // Helper function to fail when unknown command arguments are passed // function failOnUnknown(fn) { return function(arg) { if (arguments.length > 1) { console.log(cst.PREFIX_MSG + '\nUnknown command argument: ' + arg); commander.outputHelp(); process.exit(cst.ERROR_EXIT); } return fn.apply(this, arguments); }; } /** * @todo to remove at some point once it's fixed in official commander.js * https://github.com/tj/commander.js/issues/475 * * Patch Commander.js Variadic feature */ function patchCommanderArg(cmd) { var argsIndex; if ((argsIndex = commander.rawArgs.indexOf('--')) >= 0) { var optargs = commander.rawArgs.slice(argsIndex + 1); cmd = cmd.slice(0, cmd.indexOf(optargs[0])); } return cmd; } // // Start command // commander.command('start [name|namespace|file|ecosystem|id...]') .option('--watch', 'Watch folder for changes') .option('--fresh', 'Rebuild Dockerfile') .option('--daemon', 'Run container in Daemon mode (debug purposes)') .option('--container', 'Start application in container mode') .option('--dist', 'with --container; change local Dockerfile to containerize all files in current directory') .option('--image-name [name]', 'with --dist; set the exported image name') .option('--node-version [major]', 'with --container, set a specific major Node.js version') .option('--dockerdaemon', 'for debugging purpose') .description('start and daemonize an app') .action(function(cmd, opts) { if (opts.container == true && opts.dist == true) return pm2.dockerMode(cmd, opts, 'distribution'); else if (opts.container == true) return pm2.dockerMode(cmd, opts, 'development'); if (cmd == "-") { process.stdin.resume(); process.stdin.setEncoding('utf8'); process.stdin.on('data', function (cmd) { process.stdin.pause(); pm2._startJson(cmd, commander, 'restartProcessId', 'pipe'); }); } else { // Commander.js patch cmd = patchCommanderArg(cmd); if (cmd.length === 0) { cmd = [cst.APP_CONF_DEFAULT_FILE]; } let acc = [] forEachLimit(cmd, 1, function(script, next) { pm2.start(script, commander, (err, apps) => { acc = acc.concat(apps) next(err) }); }, function(err, dt) { if (err && err.message && (err.message.includes('Script not found') === true || err.message.includes('NOT AVAILABLE IN PATH') === true)) { pm2.exitCli(1) } else pm2.speedList(err ? 1 : 0, acc); }); } }); commander.command('trigger <id|proc_name|namespace|all> <action_name> [params]') .description('trigger process action') .action(function(pm_id, action_name, params) { pm2.trigger(pm_id, action_name, params); }); commander.command('deploy <file|environment>') .description('deploy your json') .action(function(cmd) { pm2.deploy(cmd, commander); }); commander.command('startOrRestart <json>') .description('start or restart JSON file') .action(function(file) { pm2._startJson(file, commander, 'restartProcessId'); }); commander.command('startOrReload <json>') .description('start or gracefully reload JSON file') .action(function(file) { pm2._startJson(file, commander, 'reloadProcessId'); }); commander.command('pid [app_name]') .description('return pid of [app_name] or all') .action(function(app) { pm2.getPID(app); }); commander.command('create') .description('return pid of [app_name] or all') .action(function() { pm2.boilerplate() }); commander.command('startOrGracefulReload <json>') .description('start or gracefully reload JSON file') .action(function(file) { pm2._startJson(file, commander, 'reloadProcessId'); }); // // Stop specific id // commander.command('stop <id|name|namespace|all|json|stdin...>') .option('--watch', 'Stop watching folder for changes') .description('stop a process') .action(function(param) { forEachLimit(param, 1, function(script, next) { pm2.stop(script, next); }, function(err) { pm2.speedList(err ? 1 : 0); }); }); // // Stop All processes // commander.command('restart <id|name|namespace|all|json|stdin...>') .option('--watch', 'Toggle watching folder for changes') .description('restart a process') .action(function(param) { // Commander.js patch param = patchCommanderArg(param); let acc = [] forEachLimit(param, 1, function(script, next) { pm2.restart(script, commander, (err, apps) => { acc = acc.concat(apps) next(err) }); }, function(err) { pm2.speedList(err ? 1 : 0, acc); }); }); // // Scale up/down a process in cluster mode // commander.command('scale <app_name> <number>') .description('scale up/down a process in cluster mode depending on total_number param') .action(function(app_name, number) { pm2.scale(app_name, number); }); // // snapshot PM2 // commander.command('profile:mem [time]') .description('Sample PM2 heap memory') .action(function(time) { pm2.profile('mem', time); }); // // snapshot PM2 // commander.command('profile:cpu [time]') .description('Profile PM2 cpu') .action(function(time) { pm2.profile('cpu', time); }); // // Reload process(es) // commander.command('reload <id|name|namespace|all>') .description('reload processes (note that its for app using HTTP/HTTPS)') .action(function(pm2_id) { pm2.reload(pm2_id, commander); }); commander.command('id <name>') .description('get process id by name') .action(function(name) { pm2.getProcessIdByName(name); }); // Inspect a process commander.command('inspect <name>') .description('inspect a process') .action(function(cmd) { pm2.inspect(cmd, commander); }); // // Stop and delete a process by name from database // commander.command('delete <name|id|namespace|script|all|json|stdin...>') .alias('del') .description('stop and delete a process from pm2 process list') .action(function(name) { if (name == "-") { process.stdin.resume(); process.stdin.setEncoding('utf8'); process.stdin.on('data', function (param) { process.stdin.pause(); pm2.delete(param, 'pipe'); }); } else forEachLimit(name, 1, function(script, next) { pm2.delete(script,'', next); }, function(err) { pm2.speedList(err ? 1 : 0); }); }); // // Send system signal to process // commander.command('sendSignal <signal> <pm2_id|name>') .description('send a system signal to the target process') .action(function(signal, pm2_id) { if (isNaN(parseInt(pm2_id))) { console.log(cst.PREFIX_MSG + 'Sending signal to process name ' + pm2_id); pm2.sendSignalToProcessName(signal, pm2_id); } else { console.log(cst.PREFIX_MSG + 'Sending signal to process id ' + pm2_id); pm2.sendSignalToProcessId(signal, pm2_id); } }); // // Stop and delete a process by name from database // commander.command('ping') .description('ping pm2 daemon - if not up it will launch it') .action(function() { pm2.ping(); }); commander.command('updatePM2') .description('update in-memory PM2 with local PM2') .action(function() { pm2.update(); }); commander.command('update') .description('(alias) update in-memory PM2 with local PM2') .action(function() { pm2.update(); }); /** * Module specifics */ commander.command('install <module|git:// url>') .alias('module:install') .option('--tarball', 'is local tarball') .option('--install', 'run yarn install before starting module') .option('--docker', 'is docker container') .option('--v1', 'install module in v1 manner (do not use it)') .option('--safe [time]', 'keep module backup, if new module fail = restore with previous') .description('install or update a module and run it forever') .action(function(plugin_name, opts) { require('util')._extend(commander, opts); pm2.install(plugin_name, commander); }); commander.command('module:update <module|git:// url>') .option('--tarball', 'is local tarball') .description('update a module and run it forever') .action(function(plugin_name, opts) { require('util')._extend(commander, opts); pm2.install(plugin_name, commander); }); commander.command('module:generate [app_name]') .description('Generate a sample module in current folder') .action(function(app_name) { pm2.generateModuleSample(app_name); }); commander.command('uninstall <module>') .alias('module:uninstall') .description('stop and uninstall a module') .action(function(plugin_name) { pm2.uninstall(plugin_name); }); commander.command('package [target]') .description('Check & Package TAR type module') .action(function(target) { pm2.package(target); }); commander.command('publish [folder]') .option('--npm', 'publish on npm') .alias('module:publish') .description('Publish the module you are currently on') .action(function(folder, opts) { pm2.publish(folder, opts); }); commander.command('set [key] [value]') .description('sets the specified config <key> <value>') .action(function(key, value) { pm2.set(key, value); }); commander.command('multiset <value>') .description('multiset eg "key1 val1 key2 val2') .action(function(str) { pm2.multiset(str); }); commander.command('get [key]') .description('get value for <key>') .action(function(key) { pm2.get(key); }); commander.command('conf [key] [value]') .description('get / set module config values') .action(function(key, value) { pm2.get() }); commander.command('config <key> [value]') .description('get / set module config values') .action(function(key, value) { pm2.conf(key, value); }); commander.command('unset <key>') .description('clears the specified config <key>') .action(function(key) { pm2.unset(key); }); commander.command('report') .description('give a full pm2 report for https://github.com/Unitech/pm2/issues') .action(function(key) { pm2.report(); }); // // PM2 I/O // commander.command('link [secret] [public] [name]') .option('--info-node [url]', 'set url info node') .description('link with the pm2 monitoring dashboard') .action(pm2.linkManagement.bind(pm2)); commander.command('unlink') .description('unlink with the pm2 monitoring dashboard') .action(function() { pm2.unlink(); }); commander.command('monitor [name]') .description('monitor target process') .action(function(name) { if (name === undefined) { return plusHandler() } pm2.monitorState('monitor', name); }); commander.command('unmonitor [name]') .description('unmonitor target process') .action(function(name) { pm2.monitorState('unmonitor', name); }); commander.command('open') .description('open the pm2 monitoring dashboard') .action(function(name) { pm2.openDashboard(); }); function plusHandler (command, opts) { if (opts && opts.infoNode) { process.env.KEYMETRICS_NODE = opts.infoNode } return PM2ioHandler.launch(command, opts) } commander.command('plus [command] [option]') .alias('register') .option('--info-node [url]', 'set url info node for on-premise pm2 plus') .option('-d --discrete', 'silent mode') .option('-a --install-all', 'install all modules (force yes)') .description('enable pm2 plus') .action(plusHandler); commander.command('login') .description('Login to pm2 plus') .action(function() { return plusHandler('login') }); commander.command('logout') .description('Logout from pm2 plus') .action(function() { return plusHandler('logout') }); // // Save processes to file // commander.command('dump') .alias('save') .option('--force', 'force deletion of dump file, even if empty') .description('dump all processes for resurrecting them later') .action(failOnUnknown(function(opts) { pm2.dump(commander.force) })); // // Delete dump file // commander.command('cleardump') .description('Create empty dump file') .action(failOnUnknown(function() { pm2.clearDump(); })); // // Save processes to file // commander.command('send <pm_id> <line>') .description('send stdin to <pm_id>') .action(function(pm_id, line) { pm2.sendLineToStdin(pm_id, line); }); // // Attach to stdin/stdout // Not TTY ready // commander.command('attach <pm_id> [command separator]') .description('attach stdin/stdout to application identified by <pm_id>') .action(function(pm_id, separator) { pm2.attach(pm_id, separator); }); // // Resurrect // commander.command('resurrect') .description('resurrect previously dumped processes') .action(failOnUnknown(function() { console.log(cst.PREFIX_MSG + 'Resurrecting'); pm2.resurrect(); })); // // Set pm2 to startup // commander.command('unstartup [platform]') .description('disable the pm2 startup hook') .action(function(platform) { pm2.uninstallStartup(platform, commander); }); // // Set pm2 to startup // commander.command('startup [platform]') .description('enable the pm2 startup hook') .action(function(platform) { pm2.startup(platform, commander); }); // // Logrotate // commander.command('logrotate') .description('copy default logrotate configuration') .action(function(cmd) { pm2.logrotate(commander); }); // // Sample generate // commander.command('ecosystem [mode]') .alias('init') .description('generate a process conf file. (mode = null or simple)') .action(function(mode) { pm2.generateSample(mode); }); commander.command('reset <name|id|all>') .description('reset counters for process') .action(function(proc_id) { pm2.reset(proc_id); }); commander.command('describe <name|id>') .description('describe all parameters of a process') .action(function(proc_id) { pm2.describe(proc_id); }); commander.command('desc <name|id>') .description('(alias) describe all parameters of a process') .action(function(proc_id) { pm2.describe(proc_id); }); commander.command('info <name|id>') .description('(alias) describe all parameters of a process') .action(function(proc_id) { pm2.describe(proc_id); }); commander.command('show <name|id>') .description('(alias) describe all parameters of a process') .action(function(proc_id) { pm2.describe(proc_id); }); commander.command('env <id>') .description('list all environment variables of a process id') .action(function(proc_id) { pm2.env(proc_id); }); // // List command // commander .command('list') .alias('ls') .description('list all processes') .action(function() { pm2.list(commander) }); commander.command('l') .description('(alias) list all processes') .action(function() { pm2.list() }); commander.command('ps') .description('(alias) list all processes') .action(function() { pm2.list() }); commander.command('status') .description('(alias) list all processes') .action(function() { pm2.list() }); // List in raw json commander.command('jlist') .description('list all processes in JSON format') .action(function() { pm2.jlist() }); commander.command('sysmonit') .description('start system monitoring daemon') .action(function() { pm2.launchSysMonitoring() }) commander.command('slist') .alias('sysinfos') .option('-t --tree', 'show as tree') .description('list system infos in JSON') .action(function(opts) { pm2.slist(opts.tree) }) // List in prettified Json commander.command('prettylist') .description('print json in a prettified JSON') .action(failOnUnknown(function() { pm2.jlist(true); })); // // Dashboard command // commander.command('monit') .description('launch termcaps monitoring') .action(function() { pm2.dashboard(); }); commander.command('imonit') .description('launch legacy termcaps monitoring') .action(function() { pm2.monit(); }); commander.command('dashboard') .alias('dash') .description('launch dashboard with monitoring and logs') .action(function() { pm2.dashboard(); }); // // Flushing command // commander.command('flush [api]') .description('flush logs') .action(function(api) { pm2.flush(api); }); /* old version commander.command('flush') .description('flush logs') .action(failOnUnknown(function() { pm2.flush(); })); */ // // Reload all logs // commander.command('reloadLogs') .description('reload all logs') .action(function() { pm2.reloadLogs(); }); // // Log streaming // commander.command('logs [id|name|namespace]') .option('--json', 'json log output') .option('--format', 'formated log output') .option('--raw', 'raw output') .option('--err', 'only shows error output') .option('--out', 'only shows standard output') .option('--lines <n>', 'output the last N lines, instead of the last 15 by default') .option('--timestamp [format]', 'add timestamps (default format YYYY-MM-DD-HH:mm:ss)') .option('--nostream', 'print logs without launching the log stream') .option('--highlight [value]', 'highlights the given value') .description('stream logs file. Default stream all logs') .action(function(id, cmd) { var Logs = require('../API/Log.js'); if (!id) id = 'all'; var line = 15; var raw = false; var exclusive = false; var timestamp = false; var highlight = false; if(!isNaN(parseInt(cmd.lines))) { line = parseInt(cmd.lines); } if (cmd.parent.rawArgs.indexOf('--raw') !== -1) raw = true; if (cmd.timestamp) timestamp = typeof cmd.timestamp === 'string' ? cmd.timestamp : 'YYYY-MM-DD-HH:mm:ss'; if (cmd.highlight) highlight = typeof cmd.highlight === 'string' ? cmd.highlight : false; if (cmd.out === true) exclusive = 'out'; if (cmd.err === true) exclusive = 'err'; if (cmd.nostream === true) pm2.printLogs(id, line, raw, timestamp, exclusive); else if (cmd.json === true) Logs.jsonStream(pm2.Client, id); else if (cmd.format === true) Logs.formatStream(pm2.Client, id, false, 'YYYY-MM-DD-HH:mm:ssZZ', exclusive, highlight); else pm2.streamLogs(id, line, raw, timestamp, exclusive, highlight); }); // // Kill // commander.command('kill') .description('kill daemon') .action(failOnUnknown(function(arg) { pm2.killDaemon(function() { process.exit(cst.SUCCESS_EXIT); }); })); // // Update repository for a given app // commander.command('pull <name> [commit_id]') .description('updates repository for a given app') .action(function(pm2_name, commit_id) { if (commit_id !== undefined) { pm2._pullCommitId({ pm2_name: pm2_name, commit_id: commit_id }); } else pm2.pullAndRestart(pm2_name); }); // // Update repository to the next commit for a given app // commander.command('forward <name>') .description('updates repository to the next commit for a given app') .action(function(pm2_name) { pm2.forward(pm2_name); }); // // Downgrade repository to the previous commit for a given app // commander.command('backward <name>') .description('downgrades repository to the previous commit for a given app') .action(function(pm2_name) { pm2.backward(pm2_name); }); // // Perform a deep update of PM2 // commander.command('deepUpdate') .description('performs a deep update of PM2') .action(function() { pm2.deepUpdate(); }); // // Launch a http server that expose a given path on given port // commander.command('serve [path] [port]') .alias('expose') .option('--port [port]', 'specify port to listen to') .option('--spa', 'always serving index.html on inexistant sub path') .option('--basic-auth-username [username]', 'set basic auth username') .option('--basic-auth-password [password]', 'set basic auth password') .option('--monitor [frontend-app]', 'frontend app monitoring (auto integrate snippet on html files)') .description('serve a directory over http via port') .action(function (path, port, cmd) { pm2.serve(path, port || cmd.port, cmd, commander); }); commander.command('autoinstall') .action(function() { pm2.autoinstall() }) commander.command('examples') .description('display pm2 usage examples') .action(() => { console.log(cst.PREFIX_MSG + chalk.gray('pm2 usage examples:\n')); displayExamples(); process.exit(cst.SUCCESS_EXIT); }) // // Catch all // commander.command('*') .action(function() { console.log(cst.PREFIX_MSG_ERR + chalk.bold('Command not found\n')); displayUsage(); // Check if it does not forget to close fds from RPC process.exit(cst.ERROR_EXIT); }); // // Display help if 0 arguments passed to pm2 // if (process.argv.length == 2) { commander.parse(process.argv); displayUsage(); // Check if it does not forget to close fds from RPC process.exit(cst.ERROR_EXIT); }