diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml
index cc4dbadce9c2973115149b25c37e80c97a68ae85..8c294c6da1b9c6cb6c9ac32071bcec2f8022426c 100644
--- a/.github/workflows/e2e.yml
+++ b/.github/workflows/e2e.yml
@@ -21,6 +21,9 @@ jobs:
         node-version: [18, 20]
         python-version: ["3.11"]
         os: [macos-latest, windows-latest]
+    defaults:
+      run:
+        shell: bash
     runs-on: ${{ matrix.os }}
     steps:
       - uses: actions/checkout@v4
diff --git a/packages/create-llama/e2e/basic.spec.ts b/packages/create-llama/e2e/basic.spec.ts
index ee4ba33b64b0006828477a0b5c65edf30a486971..70ec0b0736853b31b7d2d85156b9fb4e4b445ade 100644
--- a/packages/create-llama/e2e/basic.spec.ts
+++ b/packages/create-llama/e2e/basic.spec.ts
@@ -124,7 +124,7 @@ for (const templateType of templateTypes) {
 
           // clean processes
           test.afterAll(async () => {
-            appProcess.kill();
+            appProcess?.kill();
           });
         });
       }
diff --git a/packages/create-llama/e2e/utils.ts b/packages/create-llama/e2e/utils.ts
index 9e2c8ddee97f20d0bd3f0720f1e79e7690867c52..e03ec73c7434d56f0d000e9cc54797fe53c20f90 100644
--- a/packages/create-llama/e2e/utils.ts
+++ b/packages/create-llama/e2e/utils.ts
@@ -110,15 +110,18 @@ export async function runCreateLlama(
   console.log(`running command '${command}' in ${cwd}`);
   let appProcess = exec(command, {
     cwd,
+    env: {
+      ...process.env,
+    },
   });
-  appProcess.on("error", (err) => {
-    console.error(err);
-    appProcess.kill();
-  });
-  // Show log from cp
-  appProcess.stdout?.on("data", (data) => {
+  appProcess.stderr?.on("data", (data) => {
     console.log(data.toString());
   });
+  appProcess.on("exit", (code) => {
+    if (code !== 0 && code !== null) {
+      throw new Error(`create-llama command was failed!`);
+    }
+  });
 
   // Wait for app to start
   if (postInstallAction === "runApp") {
diff --git a/packages/create-llama/helpers/run-app.ts b/packages/create-llama/helpers/run-app.ts
index b77da58bfab133431c6004e9435d551731a4ab76..dbadda0badb6102b9a0d9efe076b2f720f23f5be 100644
--- a/packages/create-llama/helpers/run-app.ts
+++ b/packages/create-llama/helpers/run-app.ts
@@ -1,8 +1,28 @@
-import { ChildProcess, spawn } from "child_process";
-import { log } from "console";
+import { ChildProcess, SpawnOptions, spawn } from "child_process";
 import path from "path";
 import { TemplateFramework } from "./types";
 
+const createProcess = (
+  command: string,
+  args: string[],
+  options: SpawnOptions,
+) => {
+  return spawn(command, args, {
+    ...options,
+    shell: true,
+  })
+    .on("exit", function (code) {
+      if (code !== 0) {
+        console.log(`Child process exited with code=${code}`);
+        process.exit(1);
+      }
+    })
+    .on("error", function (err) {
+      console.log("Error when running chill process: ", err);
+      process.exit(1);
+    });
+};
+
 // eslint-disable-next-line max-params
 export async function runApp(
   appPath: string,
@@ -17,13 +37,10 @@ export async function runApp(
   let backendPort = externalPort || 8000;
 
   // Callback to kill app processes
-  const killAppProcesses = () => {
-    log("Killing app processes...");
+  process.on("exit", () => {
+    console.log("Killing app processes...");
     backendAppProcess.kill();
     frontendAppProcess?.kill();
-  };
-  process.on("exit", () => {
-    killAppProcesses();
   });
 
   let backendCommand = "";
@@ -35,7 +52,7 @@ export async function runApp(
       "uvicorn",
       "main:app",
       "--host=0.0.0.0",
-      "--port=" + (externalPort || backendPort),
+      "--port=" + backendPort,
     ];
   } else if (framework === "nextjs") {
     backendCommand = "npm";
@@ -48,30 +65,24 @@ export async function runApp(
 
   if (frontend) {
     return new Promise((resolve, reject) => {
-      backendAppProcess = spawn(backendCommand, backendArgs, {
+      backendAppProcess = createProcess(backendCommand, backendArgs, {
         stdio: "inherit",
         cwd: path.join(appPath, "backend"),
         env: { ...process.env, PORT: `${backendPort}` },
       });
-      frontendAppProcess = spawn("npm", ["run", "dev"], {
+      frontendAppProcess = createProcess("npm", ["run", "dev"], {
         stdio: "inherit",
         cwd: path.join(appPath, "frontend"),
         env: { ...process.env, PORT: `${frontendPort}` },
       });
-    }).catch((err) => {
-      console.error(err);
-      killAppProcesses();
     });
   } else {
     return new Promise((resolve, reject) => {
-      backendAppProcess = spawn(backendCommand, backendArgs, {
+      backendAppProcess = createProcess(backendCommand, backendArgs, {
         stdio: "inherit",
-        cwd: appPath,
+        cwd: path.join(appPath),
         env: { ...process.env, PORT: `${backendPort}` },
       });
-    }).catch((err) => {
-      console.log(err);
-      killAppProcesses();
     });
   }
 }