Centos
ping cron 作業在 cron 計劃中不起作用,但在命令行中起作用
我安排了這個 cron:
0 * * * * ping -D -O -c 3492 8.8.8.8 | grep received > /home/user/.direc/packet_drops.txt
該命令在手動執行時工作正常,並在 ping 完成後正常導出到 .txt 文件。
在 cron 中執行時,文件保持為空。我在同一使用者下嘗試了手動命令和 cron,同樣的問題。
我錯過了什麼?我也嘗試過重定向錯誤輸出,但它仍然是空的。
正如對您的問題的評論中所述,您查看
/home/user/.direc/packet_drops.txt
文件時文件為空的可能原因是因為它已被下一次執行 cron 作業截斷。作業一開始就設置管道,並且重定向作為初始設置的一部分執行。
ping
每隔一小時啟動一次並執行 3492 秒,因此packet_drops.txt
在它被截斷之前只給你一個(理論上的)108 秒的每小時讀取視窗。一種僅在長時間執行的作業終止時覆蓋日誌文件的方法(正如您在評論中要求的那樣)是將其輸出列印到臨時文件並在作業結束時替換目標文件。
更容易將其管理為
script
:#!/bin/sh trap 'rm -f -- "$tmpfile"' EXIT tmpfile=$(mktemp) ping -D -O -c 3492 8.8.8.8 | grep received >"$tmpfile" cat -- "$tmpfile" >/home/user/.direc/packet_drops.txt
並定義一個更簡單的 cron 作業(它失敗的方式更少,因此更容易調試):
0 * * * * /path/to/script
或者,為了保持單行的簡潔性,您可以利用
awk
’ 操作文件的能力:ping -D -O -c 3492 8.8.8.8 | awk -v file=/h..s.txt '/received/ { print >file }'
(縮短文件名僅是為了該程式碼塊的可讀性)。
此 AWK 腳本仍會截斷輸出文件,但僅當
received
在輸入數據中找到行匹配時才會執行此操作。