From e19c8f96eb8230872c2614ba02119a194cf45ef5 Mon Sep 17 00:00:00 2001 From: bolade Date: Tue, 28 Oct 2025 22:03:32 +0100 Subject: [PATCH] feat: Add server management script with start, stop, and restart functionality --- .gitignore | 6 +- app/__pycache__/main.cpython-312.pyc | Bin 6674 -> 7231 bytes .../__pycache__/investors.cpython-312.pyc | Bin 23593 -> 23770 bytes server_manager.sh | 68 ++++++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100755 server_manager.sh diff --git a/.gitignore b/.gitignore index e729125..646ada1 100644 --- a/.gitignore +++ b/.gitignore @@ -13,4 +13,8 @@ *.cypython -nohup.out \ No newline at end of file +nohup.out + +server.log + +server.pid \ No newline at end of file diff --git a/app/__pycache__/main.cpython-312.pyc b/app/__pycache__/main.cpython-312.pyc index 4c7ce62d4f601a929a78c79e87ec2fa4c9d00b0d..d42cd7b3884420845cc86b3a6fad012060cffac5 100644 GIT binary patch delta 3461 zcmd5;TWl2989rxcclN&P^?I+Y&Dt37a{wN$N-$c+hEX#VBG7%ax(fxC|Qj=5xRy5B3MC^J!1)5 zvO^MJb|_BOCAm~l5>>b4#@t6xJgQgnTD(*7seZ|?2Bd%*l!9tV3aMc!Y}s5&lNymC z7B4EzYE+6^yjy8eV^U0wOVzlVkP>QAN~$R-rKY8{<={~^s2M4vwo0vPo786Myvjy3 zD`hR-r?jgbQisL+l}&1=)QOP;QSU6@9SpDprjfK6ba?!vty@Xy)>+KuDne2hIBkCX zB1rzaB;{ys{OrmXZJtI*a1@h}MS+_O&$?_2598~IG)*HCq0w2v)=JwgZ8K=2E3`Xk zH8=k4)$pXnjt(Ibn?{Xbx*?eS8s2e|7{zoK-JJsCT(Z6>Y$QNZbtI62kEIa@NmG$* zsM0XW&^;p}X`Oa87TWtI3$@WU+R7Ip8)47c`a-0gZU?}QX=ejr-a26n!-~!x6N1-dIw#m`&dEK2Tna@I*-W;1zKjR z89Y8beCp`MBAw9Xa>?|aolwdJ!X0wh3=KVV`ph?FLKHe#U^llpKf|teST}7X#OyaV z0%ziF!#SrJEGSBOGGAu$s9e&_h%FWwCA6f=1x2fSs8k;-lZH4(3xqPwI4Iu4IpZ(l zbfyhJ8AoPW4lfRsOC$0q+YZ8B<285tDa*D8#HVkFtQ%(5!^tinrl9G}4CnKOQmL#L z_=dE6o^faPMO+5wi7c|~O;1|1FuRPbr{K(i!MHB=8o%;n#2wr#XWaK3ukKs}!~#A5 zhQsh^Ng&hc_kq}QQ+hs=uL+K1s3tgDeG8tHy(24Xws#GrKCa{BAZPY-V#UN&k8n>B z89(>#>$CRo#f_LE9HF9*u_NGl3?3~AgQ%Rqu;MkO)pyY3^aVW;du$3 z2m3*L0;=IPnv>;boT#U2*6l_v2&SYtJhwaa?wcTb*L17NP4<``;GoB?Y6) zjx*>h=*PKDNDtIKI}z)>BCNm<*DY4LwFTn5EL=x#JBVveoORebjPyv|mALh2oxj{z zaL!ZreGwCUMfia*i6_xT;dwNP-vd79y|m+770RZva_It`NttOqBb5@-vK37(jb=;6 zJCShp=}R59Q?aa0C{(8;t5u3cs%aw?MVZP@%KBLLktfTjR#9~AQu-)kWd@L0IA}JN zZ(twD4&T70hh8j#ZlwIjhj7?89Hw7`^sZ?6Vwq4=BvdcRO3uf4)iZ+=tXk$v{-sAwqCZwG%?knm7^>S`*wz( zh?b3kd5V7n?MJ|UhW>gL)qHN(q5CZzcUwAVyvvE~Qlfhy(f#h^QqPfvo+Eb?{Y#Pl z8S%a+^qT)w|9rgfR{X=v2bo);+hg-B&n$XQEr(+>!I}#-58%H&6j31dIdT9X_y=AM z%qMog-~N7dKGu8NITKj)9K9df@UHO7>d-BG^VnkO;JoMH-)k=L|HlJDL@M@GTs-Ul9wwwG+Y(}iSeq*nmFM_ku`G?H8P3J z(H73eIEe!>QyOI#WT+{C%rC%{U0NU{>&uwYhFwwAywyw?OBz=ai7GEitet~+N2z|& zszP?#KF=-u@5>Ao2+2PV-)_$QzM2BOW3@KZIZ@Vh)2Yau61k|Gf?U$Ac4bu^>sy*3 zxl~jtgy!vinxgUNgm~6;S0MT_E13eTl%Dt%c;q>xmPtjShuJHzB-B@=wL`n82^iyh z$a@ck{(z#Npq&e7=f|k+6EyfcH25*vV;oQBPS$+Lw_zr++QTMeu{$A z;ZMcjOY&8rCL-)yLd^@PdD+>#9F4!ec{!f8XD-zI2uB|x5j!5X7(YzD6ZhgnKRfg} og6V-2A5ft8B1<@srdB delta 2865 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/dev/null; then + echo "Server is already running (PID: $(cat "$PID_FILE"))" + return 1 + fi + echo "Starting server..." + nohup uv run app/main.py > "$LOG_FILE" 2>&1 & + echo $! > "$PID_FILE" + echo "Server started (PID: $(cat "$PID_FILE"))" +} + +stop() { + if [ ! -f "$PID_FILE" ]; then + echo "Server is not running (no PID file found)" + return 1 + fi + PID=$(cat "$PID_FILE") + if ! kill -0 "$PID" 2>/dev/null; then + echo "Server is not running (PID $PID not found)" + rm -f "$PID_FILE" + return 1 + fi + echo "Stopping server (PID: $PID)..." + kill "$PID" + # Wait for process to stop + for i in {1..10}; do + if ! kill -0 "$PID" 2>/dev/null; then + break + fi + sleep 1 + done + if kill -0 "$PID" 2>/dev/null; then + echo "Force killing server..." + kill -9 "$PID" + fi + rm -f "$PID_FILE" + echo "Server stopped" +} + +restart() { + stop + sleep 2 + start +} + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart) + restart + ;; + *) + echo "Usage: $0 {start|stop|restart}" + exit 1 + ;; +esac \ No newline at end of file