Skip to content

Commit

Permalink
[cron.d] Add cron job to periodically clean-up core files (#3449)
Browse files Browse the repository at this point in the history
* [cron.d] Create cron job to periodically clean-up core files
* Create script to scan /var/core and clean-up older core files
* Create cron job to run clean-up script

Signed-off-by: Danny Allen <[email protected]>

* Update interval for running cron job

* Respond to feedback

* Change syslog id
  • Loading branch information
daall authored and yxieca committed Sep 13, 2019
1 parent 94f2113 commit ba77de1
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 0 deletions.
3 changes: 3 additions & 0 deletions build_debian.sh
Original file line number Diff line number Diff line change
Expand Up @@ -399,6 +399,9 @@ build_number: ${BUILD_NUMBER:-0}
built_by: $USER@$BUILD_HOSTNAME
EOF

## Copy over clean-up script
sudo cp ./files/scripts/core_cleanup.py $FILESYSTEM_ROOT/usr/bin/core_cleanup.py

## Copy ASIC config checksum
python files/build_scripts/generate_asic_config_checksum.py
if [[ ! -f './asic_config_checksum' ]]; then
Expand Down
3 changes: 3 additions & 0 deletions files/image_config/cron.d/core_cleanup
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# Attempts to clean up core files every 2 hours
* */2 * * * root /usr/bin/core_cleanup.py > /dev/null 2>&1

51 changes: 51 additions & 0 deletions files/scripts/core_cleanup.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#!/usr/bin/env python

import syslog
import os

from collections import defaultdict
from datetime import datetime

SYSLOG_IDENTIFIER = 'core_cleanup.py'
CORE_FILE_DIR = os.path.basename(__file__)
MAX_CORE_FILES = 4

def log_info(msg):
syslog.openlog(SYSLOG_IDENTIFIER)
syslog.syslog(syslog.LOG_INFO, msg)
syslog.closelog()

def log_error(msg):
syslog.openlog(SYSLOG_IDENTIFIER)
syslog.syslog(syslog.LOG_ERR, msg)
syslog.closelog()

def main():
if os.getuid() != 0:
log_error('Root required to clean up core files')
return

log_info('Cleaning up core files')
core_files = [f for f in os.listdir(CORE_FILE_DIR) if os.path.isfile(os.path.join(CORE_FILE_DIR, f))]

core_files_by_process = defaultdict(list)
for f in core_files:
process = f.split('.')[0]
curr_files = core_files_by_process[process]
curr_files.append(f)

if len(curr_files) > MAX_CORE_FILES:
curr_files.sort(reverse = True, key = lambda x: datetime.utcfromtimestamp(int(x.split('.')[1])))
oldest_core = curr_files[MAX_CORE_FILES]
log_info('Deleting {}'.format(oldest_core))
try:
os.remove(os.path.join(CORE_FILE_DIR, oldest_core))
except:
log_error('Unexpected error occured trying to delete {}'.format(oldest_core))
core_files_by_process[process] = curr_files[0:MAX_CORE_FILES]

log_info('Finished cleaning up core files')

if __name__ == '__main__':
main()

0 comments on commit ba77de1

Please sign in to comment.