簡體   English   中英

Bash 根 crontab 腳本掛起並且不再運行

[英]Bash root crontab script hangs and doesn't run again

更新:我將*/30 * * * * run-one /opt/scripts/staleFile.sh的 run-one 替換為
run-this-one並更新日志。 似乎 run-one 阻止了它,我不確定 run-one 中的鎖是如何處理的。 但是我的腳本中有一些東西阻止它釋放鎖。 我搜索ps aux | grep [script-name] ps aux | grep [script-name]ps aux | grep [PID of original stuck cron command from syslog] ps aux | grep [PID of original stuck cron command from syslog]但沒有看到腳本實際上卡住了,所以我認為這是run-one的問題。 我在其他幾個 cron 腳本中使用 run-one 並且還沒有遇到問題。 如果有人對什么是絆倒它有任何建議,我全神貫注。 /更新

我有一個 bash 根 crontab 腳本,它每 30 分鍾運行一次以檢查 nfs 陳舊文件句柄,如果存在陳舊句柄,則通過重新掛載 fstab 來修復它。 每次我將數據移動到 nfs 共享時都會發生這種情況,第二天早上 7 點左右再次發生這種情況,因為當數據移動到共享上時,它首先加載到緩存驅動器上,然后在清晨移動到 HDD。 它似乎根據日志成功完成(粘貼在腳本下方),但根據日志文件時間戳需要永遠完成(1hr51m)如果遇到過時的句柄並修復它,它將不會再次運行 如果相同的腳本只是以 root 身份運行,即“sudo./staleFile.sh” ,它會快速完成(不到一分鍾),並且按預期完成。

我有 docker 容器,這些容器依賴於合並本地數據和來自我的 nfs 共享的數據的合並掛載,這就是我在腳本運行時停止這些容器的原因。

以下是我的 sudo crontab 的相關摘錄

SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

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

以下是有問題的腳本

#!/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

以下是日志的摘錄(奇怪的字符來自 docker 在控制台中以綠色突出顯示“完成”,在控制台上查看時一切正常):

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,這意味着它首先需要很長時間(1 小時 51 分鍾)才能完成。 我有其他根 crontab 腳本繼續按計划運行。

嘗試將 cron 從以下位置更改:

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

對此

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

添加 su -root 以 root 身份運行腳本

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM