Run Thursday Morning Jobs at 9 AM | CronBase
0 9 * * 4 Every Thursday morning at nine o'clock
The `0 9 * * 4` cron expression schedules a task to run once a week on Thursday mornings at exactly 9:00 AM. This cadence is ideal for mid-week operations, end-of-week preparation reports, weekly backup verification, and automated system synchronization before the weekend begins.
- Minute
- 0
- Hour
- 9
- Day of Month
- *
- Month
- *
- Day of Week
- 4
Next 5 Runs
- in 4d 12h
- in 11d 12h
- in 18d 12h
- in 25d 12h
- in 32d 12h
* Tools
Code & Implementations
#!/usr/bin/env bash
# Production Bash Cron Runner for Thursday 9 AM Tasks
set -euo pipefail
LOG_FILE="/var/log/thursday_weekly_job.log"
exec >> "$LOG_FILE" 2>&1
echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] Starting Thursday weekly maintenance..."
if ! /usr/local/bin/run-weekly-sync; then
echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] ERROR: Weekly sync failed!" >&2
exit 1
fi
echo "[$(date -u +'%Y-%m-%dT%H:%M:%SZ')] Thursday weekly maintenance completed successfully." › Setup notes
Place this script in /usr/local/bin/thursday-job.sh, make it executable, and add '0 9 * * 4 /usr/local/bin/thursday-job.sh' to your crontab.
const cron = require('node-cron');
const { exec } = require('child_process');
// Schedule task to run at 9:00 AM every Thursday
cron.schedule('0 9 * * 4', () => {
console.log(`[${new Date().toISOString()}] Initiating Thursday morning cron job...`);
exec('/usr/local/bin/weekly-report.sh', (error, stdout, stderr) => {
if (error) {
console.error(`[ERROR] Execution failed: ${error.message}`);
return;
}
if (stderr) {
console.warn(`[WARN] Standard Error Output: ${stderr}`);
}
console.log(`[SUCCESS] Output: ${stdout}`);
});
}, {
scheduled: true,
timezone: "UTC"
}); › Setup notes
Install node-cron using 'npm install node-cron' and run this script as a daemonized background process using PM2.
from apscheduler.schedulers.blocking import BlockingScheduler
import logging
import sys
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
def execute_thursday_job():
logging.info("Starting weekly Thursday 9:00 AM job execution.")
try:
# Perform production business logic here
pass
except Exception as e:
logging.error(f"Job failed with exception: {str(e)}")
sys.exit(1)
scheduler = BlockingScheduler(timezone="UTC")
scheduler.add_job(execute_thursday_job, 'cron', day_of_week='thu', hour=9, minute=0)
try:
scheduler.start()
except (KeyboardInterrupt, SystemExit):
pass › Setup notes
Install APScheduler using 'pip install apscheduler' and run this script in your application environment.
package main
import (
"log"
"os"
"os/signal"
"syscall"
"time"
"github.com/robfig/cron/v3"
)
func main() {
logger := log.New(os.Stdout, "CRON_JOB: ", log.LstdFlags|log.Lshortfile)
nyc, err := time.LoadLocation("UTC")
if err != nil {
logger.Fatalf("Failed to load timezone: %v", err)
}
c := cron.New(cron.WithLocation(nyc))
_, err = c.AddFunc("0 9 * * 4", func() {
logger.Println("Running Thursday weekly task...")
})
if err != nil {
logger.Fatalf("Failed to schedule job: %v", err)
}
c.Start()
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
<-sig
c.Stop()
} › Setup notes
Run 'go get github.com/robfig/cron/v3' to install the dependency, then compile and deploy this binary.
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Component
public class ThursdayWeeklyScheduler {
private static final Logger logger = LoggerFactory.getLogger(ThursdayWeeklyScheduler.class);
@Scheduled(cron = "0 0 9 * * THU", zone = "UTC")
public void runWeeklyTask() {
logger.info("Starting Thursday morning scheduled maintenance task");
try {
// Production business logic goes here
} catch (Exception e) {
logger.error("Failed to complete Thursday weekly task", e);
}
}
} › Setup notes
Ensure @EnableScheduling is active in your Spring Boot application configuration and place this class within your component scan path.
apiVersion: batch/v1
kind: CronJob
metadata:
name: thursday-weekly-sync
namespace: production
spec:
schedule: "0 9 * * 4"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 5
jobTemplate:
spec:
template:
spec:
containers:
- name: worker
image: registry.example.com/jobs/weekly-sync:v1.2.0
env:
- name: TZ
value: "UTC"
restartPolicy: OnFailure › Setup notes
Apply this configuration using 'kubectl apply -f cronjob.yaml' in your production cluster namespace.
Last verified:
Monitor this schedule in production
Get alerted the moment this cron job fails, is late, or doesn't run. BetterStack tracks execution, duration, and output — no infrastructure required.
Platform Equivalents
AWS EventBridge
Standard cron expressions often need conversion for AWS EventBridge schedules.
cron(0 9 ? * 4 *) Systemd Timer
OnCalendarThu *-*-* 09:00:00
[Unit]
Description=Timer for cron expression: 0 9 * * 4
[Timer]
OnCalendar=Thu *-*-* 09:00:00
Persistent=true
[Install]
WantedBy=timers.target
Last verified:
Frequently Asked Questions
What day of the week does the number 4 represent in standard cron?
In standard cron dialects, the number 4 in the fifth field represents Thursday, assuming Sunday is 0 or 7 and Monday is 1. Always verify your specific environment's dialect, as some systems vary.
How do Daylight Saving Time (DST) changes affect this 9:00 AM schedule?
If your cron daemon runs on local time, DST transitions will cause the job to execute at a different UTC offset twice a year. To maintain a strict 24-hour separation or predictable UTC runtime, run your cron daemon in UTC.
What happens if a previous Thursday job is still running when 9:00 AM arrives?
By default, standard cron will start a new process regardless of whether the previous instance finished. Use locking mechanisms like `flock` in Bash or `concurrencyPolicy: Forbid` in Kubernetes to prevent concurrent executions.
Can I run this job on Thursday only if it is the first Thursday of the month?
Standard cron does not support logic like "first Thursday of the month" natively. You must schedule the job for every Thursday (`0 9 * * 4`) and add an evaluation script to check if the current day is between 1 and 7.
How can I safely test a job scheduled for Thursday at 9:00 AM?
You can temporarily shift the cron expression to run every few minutes (e.g., `*/5 * * * *`) in a staging environment, or trigger the underlying script manually to verify its behavior and performance under load.
* Explore
Related expressions you might need
Last verified: