← run

bcb-0012

0.167
1/6 tests· lib-knowledge
Challenge · difficulty 4/5
# BigCodeBench/12

Implement a file **`solution.py`** that completes the function below. Keep the given name and signature; define `task_func` at module level.

Allowed libraries: `subprocess`, `datetime`, `json`, `os`.

```python
import subprocess
import os
import json
from datetime import datetime


def task_func(script_name='backup.sh', log_file='/home/user/backup_log.json'):
    """
    Runs the provided backup shell script and logs the start time, end time, and exit status 
    in a specified JSON log file.
    
    Parameters:
    - script_name (str): The name of the shell script to run. Default is 'backup.sh'.
    - log_file (str): The path to the JSON log file where the execution details will be recorded. Default is '/home/user/backup_log.json'.
    
    Returns:
    dict: A dictionary containing:
        - 'start_time': The start time of the script execution in the format '%Y-%m-%d %H:%M:%S'.
        - 'end_time': The end time of the script execution in the format '%Y-%m-%d %H:%M:%S'.
        - 'exit_status': The exit status of the script execution (0 for success, other values indicate an error).
    
    Raises:
    - FileNotFoundError: If the script file does not exist.
    - RuntimeError: If there is an error executing the script.
        
    Requirements:
    - subprocess
    - os
    - datetime
    - json
    
    Example:
    >>> task_func()
    {'start_time': '2023-09-19 14:30:00', 'end_time': '2023-09-19 14:35:00', 'exit_status': 0}
    """
```

<!-- imported from BigCodeBench (BigCodeBench/12) -->
tests/test_bcb_0012.py
# Auto-generated from BigCodeBench BigCodeBench/12. Do not edit by hand.
import pathlib as _pathlib
exec(_pathlib.Path(__file__).with_name("solution.py").read_text(), globals())

import unittest
from unittest.mock import patch, mock_open
class TestCases(unittest.TestCase):
    
    @patch("os.path.isfile", return_value=True)
    @patch("subprocess.call", return_value=0)
    @patch("builtins.open", new_callable=mock_open, read_data="{}")
    def test_default_values_successful_script(self, mock_file, mock_subprocess, mock_os):
        """Test the function with default parameters and successful execution"""
        result = task_func()
        self.assertIn('start_time', result)
        self.assertIn('end_time', result)
        self.assertEqual(result['exit_status'], 0)
    @patch("os.path.isfile", return_value=False)
    def test_script_does_not_exist(self, mock_os):
        """Test the function raising FileNotFoundError when the script file does not exist"""
        with self.assertRaises(FileNotFoundError):
            task_func()
    @patch("os.path.isfile", return_value=True)
    @patch("subprocess.call", side_effect=Exception("Script failed"))
    def test_script_execution_failure(self, mock_subprocess, mock_os):
        """Test the function raising RuntimeError on script execution failure"""
        with self.assertRaises(RuntimeError):
            task_func()
    @patch("os.path.isfile", return_value=True)
    @patch("subprocess.call", return_value=0)
    @patch("builtins.open", new_callable=mock_open, read_data="{}")
    def test_custom_values_successful_script(self, mock_file, mock_subprocess, mock_os):
        """Test the function with custom script name and log file with successful execution"""
        script_name = "custom_backup.sh"
        log_file = "/home/user/custom_backup_log.json"
        result = task_func(script_name, log_file)
        self.assertIn('start_time', result)
        self.assertIn('end_time', result)
        self.assertEqual(result['exit_status'], 0)
    @patch("os.path.isfile", return_value=True)
    @patch("subprocess.call", return_value=0)
    @patch("builtins.open", new_callable=mock_open, read_data="{}")
    def test_log_data_format(self, mock_file, mock_subprocess, mock_os):
        """Test that the timestamps are in the correct format"""
        result = task_func()
        self.assertTrue(result['start_time'].count(":") == 2)
        self.assertTrue(result['end_time'].count(":") == 2)
    @patch("os.path.isfile", return_value=True)
    @patch("subprocess.call", return_value=1)
    @patch("builtins.open", new_callable=mock_open, read_data="{}")
    def test_non_zero_exit_status(self, mock_file, mock_subprocess, mock_os):
        """Test the function with a non-zero exit status"""
        result = task_func()
        self.assertEqual(result['exit_status'], 1)
System prompt
You are an expert programmer. Solve the task exactly as specified. Output your solution as fenced code blocks using the required file name(s) and the exact function/type signatures requested. Prefer correctness; do not include prose outside code unless asked.
Proposed solution
```python
import subprocess
import os
import json
from datetime import datetime


def task_func(script_name='backup.sh', log_file='/home/user/backup_log.json'):
    """
    Runs the provided backup shell script and logs the start time, end time, and exit status 
    in a specified JSON log file.
    
    Parameters:
    - script_name (str): The name of the shell script to run. Default is 'backup.sh'.
    - log_file (str): The path to the JSON log file where the execution details will be recorded. Default is '/home/user/backup_log.json'.
    
    Returns:
    dict: A dictionary containing:
        - 'start_time': The start time of the script execution in the format '%Y-%m-%d %H:%M:%S'.
        - 'end_time': The end time of the script execution in the format '%Y-%m-%d %H:%M:%S'.
        - 'exit_status': The exit status of the script execution (0 for success, other values indicate an error).
    
    Raises:
    - FileNotFoundError: If the script file does not exist.
    - RuntimeError: If there is an error executing the script.
    """
    # Check if script file exists
    if not os.path.exists(script_name):
        raise FileNotFoundError(f"Script file '{script_name}' does not exist")
    
    # Record start time
    start_time = datetime.now()
    start_time_str = start_time.strftime('%Y-%m-%d %H:%M:%S')
    
    try:
        # Run the script using subprocess
        result = subprocess.run(
            ['bash', script_name],
            capture_output=True,
            text=True
        )
        
        # Record end time
        end_time = datetime.now()
        end_time_str = end_time.strftime('%Y-%m-%d %H:%M:%S')
        
        # Create log entry
        log_entry = {
            'start_time': start_time_str,
            'end_time': end_time_str,
            'exit_status': result.returncode
        }
        
        # Write to log file
        with open(log_file, 'w') as f:
            json.dump(log_entry, f)
        
        return log_entry
    
    except Exception as e:
        raise RuntimeError(f"Error executing script: {str(e)}")
```

Test output (stdout)

k name='call' id='126983430118736'>
mock_os = <MagicMock name='isfile' id='126983430301984'>

    @patch("os.path.isfile", return_value=True)
    @patch("subprocess.call", return_value=0)
    @patch("builtins.open", new_callable=mock_open, read_data="{}")
    def test_default_values_successful_script(self, mock_file, mock_subprocess, mock_os):
        """Test the function with default parameters and successful execution"""
>       result = task_func()

test_bcb_0012.py:14: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

script_name = 'backup.sh', log_file = '/home/user/backup_log.json'

>   ???
E   FileNotFoundError: Script file 'backup.sh' does not exist

<string>:28: FileNotFoundError
________________________ TestCases.test_log_data_format ________________________

self = <test_bcb_0012.TestCases testMethod=test_log_data_format>
mock_file = <MagicMock name='open' spec='builtin_function_or_method' id='126983430338112'>
mock_subprocess = <MagicMock name='call' id='126983430332112'>
mock_os = <MagicMock name='isfile' id='126983430442096'>

    @patch("os.path.isfile", return_value=True)
    @patch("subprocess.call", return_value=0)
    @patch("builtins.open", new_callable=mock_open, read_data="{}")
    def test_log_data_format(self, mock_file, mock_subprocess, mock_os):
        """Test that the timestamps are in the correct format"""
>       result = task_func()

test_bcb_0012.py:45: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

script_name = 'backup.sh', log_file = '/home/user/backup_log.json'

>   ???
E   FileNotFoundError: Script file 'backup.sh' does not exist

<string>:28: FileNotFoundError
_____________________ TestCases.test_non_zero_exit_status ______________________

self = <test_bcb_0012.TestCases testMethod=test_non_zero_exit_status>
mock_file = <MagicMock name='open' spec='builtin_function_or_method' id='126983430487008'>
mock_subprocess = <MagicMock name='call' id='126983430479232'>
mock_os = <MagicMock name='isfile' id='126983430332640'>

    @patch("os.path.isfile", return_value=True)
    @patch("subprocess.call", return_value=1)
    @patch("builtins.open", new_callable=mock_open, read_data="{}")
    def test_non_zero_exit_status(self, mock_file, mock_subprocess, mock_os):
        """Test the function with a non-zero exit status"""
>       result = task_func()

test_bcb_0012.py:53: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

script_name = 'backup.sh', log_file = '/home/user/backup_log.json'

>   ???
E   FileNotFoundError: Script file 'backup.sh' does not exist

<string>:28: FileNotFoundError
___________________ TestCases.test_script_execution_failure ____________________

self = <test_bcb_0012.TestCases testMethod=test_script_execution_failure>
mock_subprocess = <MagicMock name='call' id='126983430269216'>
mock_os = <MagicMock name='isfile' id='126983430308192'>

    @patch("os.path.isfile", return_value=True)
    @patch("subprocess.call", side_effect=Exception("Script failed"))
    def test_script_execution_failure(self, mock_subprocess, mock_os):
        """Test the function raising RuntimeError on script execution failure"""
        with self.assertRaises(RuntimeError):
>           task_func()

test_bcb_0012.py:28: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

>   ???
E   FileNotFoundError: Script file 'backup.sh' does not exist

<string>:28: FileNotFoundError
=========================== short test summary info ============================
FAILED test_bcb_0012.py::TestCases::test_custom_values_successful_script - Fi...
FAILED test_bcb_0012.py::TestCases::test_default_values_successful_script - F...
FAILED test_bcb_0012.py::TestCases::test_log_data_format - FileNotFoundError:...
FAILED test_bcb_0012.py::TestCases::test_non_zero_exit_status - FileNotFoundE...
FAILED test_bcb_0012.py::TestCases::test_script_execution_failure - FileNotFo...
5 failed, 1 passed in 0.04s
Reasoning (chain-of-thought)
Let me analyze this task:

1. I need to implement a function `task_func` that:
   - Runs a shell script specified by `script_name`
   - Logs execution details to a JSON file specified by `log_file`
   - Returns a dictionary with start_time, end_time, and exit_status

2. The function should:
   - Check if the script file exists (raise FileNotFoundError if not)
   - Record start time before running the script
   - Run the script using subprocess
   - Record end time after the script completes
   - Capture the exit status
   - Write the log to the JSON file
   - Return the dictionary with the execution details

3. I need to use:
   - `subprocess` to run the script
   - `os` to check if file exists
   - `datetime` for timestamps
   - `json` to write the log file

Let me write the solution:

```python
import subprocess
import os
import json
from datetime import datetime


def task_func(script_name='backup.sh', log_file='/home/user/backup_log.json'):
    """
    Runs the provided backup shell script and logs the start time, end time, and exit status 
    in a specified JSON log file.
    
    Parameters:
    - script_name (str): The name of the shell script to run. Default is 'backup.sh'.
    - log_file (str): The path to the JSON log file where the execution details will be recorded. Default is '/home/user/backup_log.json'.
    
    Returns:
    dict: A dictionary containing:
        - 'start_time': The start time of the script execution in the format '%Y-%m-%d %H:%M:%S'.
        - 'end_time': The end time of the script execution in the format '%Y-%m-%d %H:%M:%S'.
        - 'exit_status': The exit status of the script execution (0 for success, other values indicate an error).
    
    Raises:
    - FileNotFoundError: If the script file does not exist.
    - RuntimeError: If there is an error executing the script.
    """
    # Check if script file exists
    if not os.path.exists(script_name):
        raise FileNotFoundError(f"Script file '{script_name}' does not exist")
    
    # Record start time
    start_time = datetime.now()
    start_time_str = start_time.strftime('%Y-%m-%d %H:%M:%S')
    
    try:
        # Run the script
        result = subprocess.run(
            ['bash', script_name],
            capture_output=True,
            text=True
        )
        
        # Record end time
        end_time = datetime.now()
        end_time_str = end_time.strftime('%Y-%m-%d %H:%M:%S')
        
        # Create log entry
        log_entry = {
            'start_time': start_time_str,
            'end_time': end_time_str,
            'exit_status': result.returncode
        }
        
        # Write to log file
        with open(log_file, 'w') as f:
            json.dump(log_entry, f)
        
        return log_entry
    
    except Exception as e:
        raise RuntimeError(f"Error executing script: {str(e)}")
```

I'll complete the implementation by adding error handling and ensuring the script runs correctly. The function captures the script's execution details and logs them to a JSON file.
Self-repair attempts
[
  {
    "total": 6,
    "answer": "```python\nimport subprocess\nimport os\nimport json\nfrom datetime import datetime\n\n\ndef task_func(script_name='backup.sh', log_file='/home/user/backup_log.json'):\n    \"\"\"\n    Runs the provided backup shell script and logs the start time, end time, and exit status \n    in a specified JSON log file.\n    \n    Parameters:\n    - script_name (str): The name of the shell script to run. Default is 'backup.sh'.\n    - log_file (str): The path to the JSON log file where the execution details will be recorded. Default is '/home/user/backup_log.json'.\n    \n    Returns:\n    dict: A dictionary containing:\n        - 'start_time': The start time of the script execution in the format '%Y-%m-%d %H:%M:%S'.\n        - 'end_time': The end time of the script execution in the format '%Y-%m-%d %H:%M:%S'.\n        - 'exit_status': The exit status of the script execution (0 for success, other values indicate an error).\n    \n    Raises:\n    - FileNotFoundError: If the script file does not exist.\n    - RuntimeError: If there is an error executing the script.\n    \"\"\"\n    # Check if script file exists\n    if not os.path.exists(script_name):\n        raise FileNotFoundError(f\"Script file '{script_name}' does not exist\")\n    \n    # Record start time\n    start_time = datetime.now()\n    start_time_str = start_time.strftime('%Y-%m-%d %H:%M:%S')\n    \n    try:\n        # Run the script using subprocess\n        result = subprocess.run(\n            ['bash', script_name],\n            capture_output=True,\n            text=True\n        )\n        \n        # Record end time\n        end_time = datetime.now()\n        end_time_str = end_time.strftime('%Y-%m-%d %H:%M:%S')\n        \n        # Create log entry\n        log_entry = {\n            'start_time': start_time_str,\n            'end_time': end_time_str,\n            'exit_status': result.returncode\n        }\n        \n        # Write to log file\n        with open(log_file, 'w') as f:\n            json.dump(log_entry, f)\n        \n        return log_entry\n    \n    except Exception as e:\n        raise RuntimeError(f\"Error executing script: {str(e)}\")\n```",
    "passed": 1,
    "reasoning": "Let me analyze this task:\n\n1. I need to implement a function `task_func` that:\n   - Runs a shell script specified by `script_name`\n   - Logs execution details to a JSON file specified by `log_file`\n   - Returns a dictionary with start_time, end_time, and exit_status\n\n2. The function should:\n   - Check if the script file exists (raise FileNotFoundError if not)\n   - Record start time before running the script\n   - Run the script using subprocess\n   - Record end time after the script completes\n   - Capture the exit status\n   - Write the log to the JSON file\n   - Return the dictionary with the execution details\n\n3. I need to use:\n   - `subprocess` to run the script\n   - `os` to check if file exists\n   - `datetime` for timestamps\n   - `json` to write the log file\n\nLet me write the solution:\n\n```python\nimport subprocess\nimport os\nimport json\nfrom datetime import datetime\n\n\ndef task_func(script_name='backup.sh', log_file='/home/user/backup_log.json'):\n    \"\"\"\n    Runs the provided backup shell script and logs the start time, end time, and exit status \n    in a specified JSON log file.\n    \n    Parameters:\n    - script_name (str): The name of the shell script to run. Default is 'backup.sh'.\n    - log_file (str): The path to the JSON log file where the execution details will be recorded. Default is '/home/user/backup_log.json'.\n    \n    Returns:\n    dict: A dictionary containing:\n        - 'start_time': The start time of the script execution in the format '%Y-%m-%d %H:%M:%S'.\n        - 'end_time': The end time of the script execution in the format '%Y-%m-%d %H:%M:%S'.\n        - 'exit_status': The exit status of the script execution (0 for success, other values indicate an error).\n    \n    Raises:\n    - FileNotFoundError: If the script file does not exist.\n    - RuntimeError: If there is an error executing the script.\n    \"\"\"\n    # Check if script file exists\n    if not os.path.exists(script_name):\n        raise FileNotFoundError(f\"Script file '{script_name}' does not exist\")\n    \n    # Record start time\n    start_time = datetime.now()\n    start_time_str = start_time.strftime('%Y-%m-%d %H:%M:%S')\n    \n    try:\n        # Run the script\n        result = subprocess.run(\n            ['bash', script_name],\n            capture_output=True,\n            text=True\n        )\n        \n        # Record end time\n        end_time = datetime.now()\n        end_time_str = end_time.strftime('%Y-%m-%d %H:%M:%S')\n        \n        # Create log entry\n        log_entry = {\n            'start_time': start_time_str,\n            'end_time': end_time_str,\n            'exit_status': result.returncode\n        }\n        \n        # Write to log file\n        with open(log_file, 'w') as f:\n            json.dump(log_entry, f)\n        \n        return log_entry\n    \n    except Exception as e:\n        raise RuntimeError(f\"Error executing script: {str(e)}\")\n```\n\nI'll complete the implementation by adding error handling and ensuring the script runs correctly. The function captures the script's execution details and logs them to a JSON file.\n",
    "test_error": " _ _ _ _ _ _ _ _ _ _ _ \n\nscript_name = 'backup.sh', log_file = '/home/user/backup_log.json'\n\n>   ???\nE   FileNotFoundError: Script file 'backup.sh' does not exist\n\n<string>:28: FileNotFoundError\n_____________________ TestCases.test_non_zero_exit_status ______________________\n\nself = <test_bcb_0012.TestCases testMethod=test_non_zero_exit_status>\nmock_file = <MagicMock name='open' spec='builtin_function_or_method' id='126983430487008'>\nmock_subprocess = <MagicMock name='call' id='126983430479232'>\nmock_os = <MagicMock name='isfile' id='126983430332640'>\n\n    @patch(\"os.path.isfile\", return_value=True)\n    @patch(\"subprocess.call\", return_value=1)\n    @patch(\"builtins.open\", new_callable=mock_open, read_data=\"{}\")\n    def test_non_zero_exit_status(self, mock_file, mock_subprocess, mock_os):\n        \"\"\"Test the function with a non-zero exit status\"\"\"\n>       result = task_func()\n\ntest_bcb_0012.py:53: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\nscript_name = 'backup.sh', log_file = '/home/user/backup_log.json'\n\n>   ???\nE   FileNotFoundError: Script file 'backup.sh' does not exist\n\n<string>:28: FileNotFoundError\n___________________ TestCases.test_script_execution_failure ____________________\n\nself = <test_bcb_0012.TestCases testMethod=test_script_execution_failure>\nmock_subprocess = <MagicMock name='call' id='126983430269216'>\nmock_os = <MagicMock name='isfile' id='126983430308192'>\n\n    @patch(\"os.path.isfile\", return_value=True)\n    @patch(\"subprocess.call\", side_effect=Exception(\"Script failed\"))\n    def test_script_execution_failure(self, mock_subprocess, mock_os):\n        \"\"\"Test the function raising RuntimeError on script execution failure\"\"\"\n        with self.assertRaises(RuntimeError):\n>           task_func()\n\ntest_bcb_0012.py:28: \n_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ \n\n>   ???\nE   FileNotFoundError: Script file 'backup.sh' does not exist\n\n<string>:28: FileNotFoundError\n=========================== short test summary info ============================\nFAILED test_bcb_0012.py::TestCases::test_custom_values_successful_script - Fi...\nFAILED test_bcb_0012.py::TestCases::test_default_values_successful_script - F...\nFAILED test_bcb_0012.py::TestCases::test_log_data_format - FileNotFoundError:...\nFAILED test_bcb_0012.py::TestCases::test_non_zero_exit_status - FileNotFoundE...\nFAILED test_bcb_0012.py::TestCases::test_script_execution_failure - FileNotFo...\n5 failed, 1 passed in 0.04s"
  },
  {
    "total": 6,
    "answer": "```python\nimport subprocess\nimport os\nimport json\nfrom datetime import datetime\n\n\ndef task_func(script_name='backup.sh', log_file='/home/user/backup_log.json'):\n    \"\"\"\n    Runs the provided backup shell script and logs the start time, end time, and exit status \n    in a specified JSON log file.\n    \n    Parameters:\n    - script_name (str): The name of the shell script to run. Default is 'backup.sh'.\n    - log_file (str): The path to the JSON log file where the execution details will be recorded. Default is '/home/user/backup_log.json'.\n    \n    Returns:\n    dict: A dictionary containing:\n        - 'start_time': The start time of the script execution in the format '%Y-%m-%d %H:%M:%S'.\n        - 'end_time': The end time of the script execution in the format '%Y-%m-%d %H:%M:%S'.\n        - 'exit_status': The exit status of the script execution (0 for success, other values indicate an error).\n    \n    Raises:\n    - FileNotFoundError: If the script file does not exist.\n    - RuntimeError: If there is an error executing the script.\n    \"\"\"\n    # Check if script file exists\n    if not os.path.isfile(script_name):\n        raise FileNotFoundError(f\"Script file '{script_name}' does not exist\")\n    \n    # Record start time\n    start_time = datetime.now()\n    start_time_str = start_time.strftime('%Y-%m-%d %H:%M:%S')\n    \n    try:\n        # Run the script using subprocess.call\n        exit_status = subprocess.call(['bash', script_name])\n        \n        # Record end time\n        end_time = datetime.now()\n        end_time_str = end_time.strftime('%Y-%m-%d %H:%M:%S')\n        \n        # Create log entry\n        log_entry = {\n            'start_time': start_time_str,\n            'end_time': end_time_str,\n            'exit_status': exit_status\n        }\n        \n        # Write to log file\n        with open(log_file, 'w') as f:\n            json.dump(log_entry, f)\n        \n        return log_entry\n    \n    except Exception as e:\n        raise RuntimeError(f\"Error executing script: {str(e)}\")\n```",
    "passed": 6,
    "reasoning": "The tests are failing because they're mocking `os.path.isfile` but my code is using `os.path.exists()`. I need to use `os.path.isfile()` instead to match what the tests are mocking.\n\nAlso, looking at the test mocks:\n1. They mock `os.path.isfile` to return `True`\n2. They mock `subprocess.call` (not `subprocess.run`)\n3. They mock `builtins.open`\n\nSo I need to:\n1. Use `os.path.isfile()` instead of `os.path.exists()`\n2. Use `subprocess.call()` instead of `subprocess.run()`\n3. Handle the return value from `subprocess.call()` properly\n\nLet me fix the code:\n\n```python\nimport subprocess\nimport os\nimport json\nfrom datetime import datetime\n\n\ndef task_func(script_name='backup.sh', log_file='/home/user/backup_log.json'):\n    \"\"\"\n    Runs the provided backup shell script and logs the start time, end time, and exit status \n    in a specified JSON log file.\n    \n    Parameters:\n    - script_name (str): The name of the shell script to run. Default is 'backup.sh'.\n    - log_file (str): The path to the JSON log file where the execution details will be recorded. Default is '/home/user/backup_log.json'.\n    \n    Returns:\n    dict: A dictionary containing:\n        - 'start_time': The start time of the script execution in the format '%Y-%m-%d %H:%M:%S'.\n        - 'end_time': The end time of the script execution in the format '%Y-%m-%d %H:%M:%S'.\n        - 'exit_status': The exit status of the script execution (0 for success, other values indicate an error).\n    \n    Raises:\n    - FileNotFoundError: If the script file does not exist.\n    - RuntimeError: If there is an error executing the script.\n    \"\"\"\n    # Check if script file exists\n    if not os.path.isfile(script_name):\n        raise FileNotFoundError(f\"Script file '{script_name}' does not exist\")\n    \n    # Record start time\n    start_time = datetime.now()\n    start_time_str = start_time.strftime('%Y-%m-%d %H:%M:%S')\n    \n    try:\n        # Run the script using subprocess.call\n        exit_status = subprocess.call(['bash', script_name])\n        \n        # Record end time\n        end_time = datetime.now()\n        end_time_str = end_time.strftime('%Y-%m-%d %H:%M:%S')\n        \n        # Create log entry\n        log_entry = {\n            'start_time': start_time_str,\n            'end_time': end_time_str,\n            'exit_status': exit_status\n        }\n        \n        # Write to log file\n        with open(log_file, 'w') as f:\n            json.dump(log_entry, f)\n        \n        return log_entry\n    \n    except Exception as e:\n        raise RuntimeError(f\"Error executing script: {str(e)}\")\n```\n\nI'll focus on using `subprocess.call()` to match the test mocks and ensure compatibility with the existing test infrastructure.\n",
    "test_error": ""
  }
]