首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bash crontab脚本挂起,不再运行

Bash crontab脚本挂起,不再运行
EN

Stack Overflow用户
提问于 2020-06-30 15:55:39
回答 1查看 216关注 0票数 0

更新:我将*/30 * * * * run-one /opt/scripts/staleFile.sh中的run-one替换为

run-this-one和日志更新了!看上去是跑的--其中一个在阻止它。我不知道run中的锁是如何处理的,但是我脚本中的一些东西阻止了它释放锁。我搜索了ps aux | grep [script-name]ps aux | grep [PID of original stuck cron command from syslog],但是没有看到脚本实际上被卡住了,所以我认为这是运行一的问题。我使用运行-在其他几个cron脚本中有一个,而且还没有出现问题。如果有人对绊倒的原因有任何建议,我会全神贯注地倾听。/UPDATE

我有一个bash根crontab脚本,它每30分钟运行一次,以检查nfs陈旧的文件句柄,如果存在过期句柄,则通过重新安装fstab来修复它。每当我将数据移动到nfs共享时,以及第二天早上7点左右再次发生这种情况,因为当数据被移动到共享时,它首先加载到缓存驱动器上,然后在清晨移动到HDD。它似乎基于日志(粘贴在脚本下面)成功完成,但是需要花费很长时间才能根据日志文件时间戳完成(1hr51m),如果遇到陈旧的句柄并修复它为,将不会再次运行。如果相同的脚本只是以root形式运行,即"sudo ./steeFile.sh“,那么它将快速完成(不到一分钟),并按预定的方式完成。

我有依赖于mergerfs挂载的坞容器,它结合本地数据和来自nfs共享的数据,这就是为什么在脚本运行时停止这些数据的原因。

以下是我的sudo crontab的相关摘录

代码语言:javascript
复制
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

*/30 * * * * run-one /opt/scripts/staleFile.sh

下面是有问题的脚本

代码语言:javascript
复制
#!/bin/bash
logFile="/av/misc/logs/stale.log" #REMEMBER TO CHANGE!
exec &>> "$logFile"

# Exit if not being run by root user.
if [[ $(/usr/bin/id -u) -ne 0 ]]; then echo "script must be run as root. exiting..."; exit 1; fi

# Get time for log
now="$(/usr/bin/date +'%Y/%m/%d %H:%M')"

# Check for stale file handle, exit script if no problems
if ls /mnt/movies &>/dev/null; then :; else mov=1; fi
if ls /mnt/TV     &>/dev/null; then :; else tv=1; fi
if [[ -z $mov && -z $tv ]]; then echo "$now: ok"; exit 0; fi

echo "Stale file handle...fixing"
echo "----------START----------"
printf "DATE: %s\n" "$now"

if [[ "$mov" && -z "$tv" ]]; then #check if just movies nfs share
    echo "STALE NFS MOVIE FILE HANDLE. FIXING..."
    docker-compose -f /opt/docker-compose.yml stop radarr
    docker-compose -f /opt/docker-compose.yml stop rutorrent
    echo "unmounting /av/mergerfs/movies"
    umount /av/mergerfs/movies
    systemctl stop plexmediaserver.service
    echo "unmounting /mnt/movies"
    umount /mnt/movies
    echo "remounting fstab"
    mount -a
    systemctl start plexmediaserver.service
    echo "remounting /av/mergerfs/movies"
    mergerfs -o allow_other,minfreespace=75G,async_read=false,use_ino,func.getattr=newest,category.action=all,category.create=ff,cache.files=partial,dropcacheonclose=true,nonempty /av/movies=RW:/mnt/movies=RO /av/mergerfs/movies
    echo "relaunching docker containers"
    mergMovies=$(find /av/mergerfs/movies/* -maxdepth 0 | wc -l)
    mergTV=$(find /av/mergerfs/tv/* -maxdepth 0 | wc -l)
    if [ "$mergMovies" -gt 1000 ]; then docker-compose -f /opt/docker-compose.yml up -d radarr; fi
    if [[ $mergTV -gt 200 && $mergMovies -gt 1000 ]]; then docker-compose -f /opt/docker-compose.yml up -d rutorrent; fi
    docker-compose -f /opt/docker-compose.yml restart reverse
    echo "finished!"
    exit 0
elif [[ -z "$mov" && "$tv" ]]; then #check if just tv nfs share
    echo "STALE NFS TV FILE HANDLE. FIXING..."
    docker-compose -f /opt/docker-compose.yml stop sonarr
    docker-compose -f /opt/docker-compose.yml stop rutorrent
    echo "unmounting /av/mergerfs/*..."
    umount /av/mergerfs/tv
    systemctl stop plexmediaserver.service
    echo "unmounting /mnt/[services]"
    umount /mnt/TV
    echo "remounting fstab"
    mount -a
    systemctl start plexmediaserver.service
    echo "remounting /av/mergerfs/tv..."
    mergerfs -o allow_other,minfreespace=75G,async_read=false,use_ino,func.getattr=newest,category.action=all,category.create=ff,cache.files=partial,dropcacheonclose=true,nonempty /av/tv=RW:/mnt/TV=RO /av/mergerfs/tv
    echo "relaunching docker containers"
    mergTV=$(find /av/mergerfs/tv/* -maxdepth 0 | wc -l)
    mergMovies=$(find /av/mergerfs/movies/* -maxdepth 0 | wc -l)
    if [ "$mergTV" -gt 200 ];      then docker-compose -f /opt/docker-compose.yml up -d sonarr; fi
    if [[ $mergTV -gt 200 && $mergMovies -gt 1000 ]]; then docker-compose -f /opt/docker-compose.yml up -d rutorrent; fi
    docker-compose -f /opt/docker-compose.yml restart reverse
    echo "finished!"
    exit 0
elif [[ "$mov" && "$tv" ]]; then #must be both
    echo "STALE NFS MOVIE & TV FILE HANDLE. FIXING..."
    docker-compose -f /opt/docker-compose.yml stop radarr
    docker-compose -f /opt/docker-compose.yml stop sonarr
    docker-compose -f /opt/docker-compose.yml stop rutorrent
    echo "unmounting /av/mergerfs/BOTH..."
    umount /av/mergerfs/movies
    umount /av/mergerfs/tv
    systemctl stop plexmediaserver.service
    echo "unmounting /mnt/BOTH"
    umount /mnt/movies
    umount /mnt/TV
    echo "remounting fstab"
    mount -a
    systemctl start plexmediaserver.service
    echo "remounting /av/mergerfs/movies..."
    mergerfs -o allow_other,minfreespace=75G,async_read=false,use_ino,func.getattr=newest,category.action=all,category.create=ff,cache.files=partial,dropcacheonclose=true,nonempty /av/movies=RW:/mnt/movies=RO /av/mergerfs/movies
    echo "remounting /av/mergerfs/tv..."
    mergerfs -o allow_other,minfreespace=75G,async_read=false,use_ino,func.getattr=newest,category.action=all,category.create=ff,cache.files=partial,dropcacheonclose=true,nonempty /av/tv=RW:/mnt/TV=RO /av/mergerfs/tv
    #restart docker containers, but check if mergerfs mount was successful based on number of files
    echo "relaunching docker containers"
    mergMovies=$(find /av/mergerfs/movies/* -maxdepth 0 | wc -l)
    mergTV=$(find /av/mergerfs/tv/* -maxdepth 0 | wc -l)
    if [ "$mergTV" -gt 200 ];      then docker-compose -f /opt/docker-compose.yml up -d sonarr; fi
    if [ "$mergMovies" -gt 1000 ]; then docker-compose -f /opt/docker-compose.yml up -d radarr; fi
    if [[ $mergTV -gt 200 && $mergMovies -gt 1000 ]]; then docker-compose -f /opt/docker-compose.yml up -d rutorrent; fi
    docker-compose -f /opt/docker-compose.yml restart reverse
    echo "finished!"
    exit 0
fi

下面是日志的摘录(奇怪的字符来自控制台中以绿色突出显示的“完成”,在控制台上查看时一切看起来都正常):

代码语言:javascript
复制
2020/06/30 04:00: ok
2020/06/30 04:30: ok
2020/06/30 05:00: ok
2020/06/30 05:30: ok
2020/06/30 06:00: ok
2020/06/30 06:30: ok
2020/06/30 07:00: ok
Stale file handle...fixing
----------START----------
DATE: 2020/06/30 07:30
STALE NFS TV FILE HANDLE. FIXING...
Stopping sonarr ... 
[1A[2K
Stopping sonarr ... [32mdone[0m
[1BStopping rutorrent ... 
[1A[2K
Stopping rutorrent ... [32mdone[0m
[1Bunmounting /av/mergerfs/*...
unmounting /mnt/[services]
remounting fstab
remounting /av/mergerfs/tv...
relaunching docker containers
Starting sonarr ... 
[1A[2K
Starting sonarr ... [32mdone[0m
[1BStarting rutorrent ... 
[1A[2K
Starting rutorrent ... [32mdone[0m
[1BRestarting reverse ... 
[1A[2K
Restarting reverse ... [32mdone[0m
[1Bfinished!

从日志中可以看到,脚本返回后的“已完成!”它不再按照计划的半小时运行。另外,日志文件上的时间戳是8:51 to,这意味着首先要花费很长时间(1hr 51m)才能完成。我还有其他根crontab脚本继续按计划运行。

EN

回答 1

Stack Overflow用户

发布于 2020-06-30 16:38:58

尝试将cron更改为:

*/30 * * * * run-one /opt/scripts/staleFile.sh

到这个

*/30 * * * * su - root run-one /opt/scripts/staleFile.sh

添加su -root以将脚本作为根用户运行

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62661442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档