我正在运行一个 cron-ed bash 脚本来提取每个 IP 地址的缓存命中和字节数。脚本 (ProxyUsage.bash) 有两部分:
- (uniqueIP.awk) 找到唯一的 IP 并创建一个 bash 脚本,将命中数和字节数相加
- 运行每个 IP 的点击数和字节数
ProxyUsage.bash
#!/usr/bin/env bash
sudo gawk -f /home/maxg/scripts/uniqueIP.awk /var/log/squid3/access.log.1 > /home/maxg/scripts/pxyUsage.bash
source /home/maxg/scripts/pxyUsage.bash
唯一IP.awk
{
arrIPs[$3]++;
}
END {
for (n in arrIPs) {
m++; # count arrIPs elements
#print "Array elements: " m;
arrAddr[i++] = n; # fill arrAddr with IPs
#print i " " n;
}
asort(arrAddr); # sort the array values
for (i = 1; i <= m; i++) { # write one command line per IP address
#printf("#!/usr/bin/env bash\n");
printf("sudo gawk -f /home/maxg/scripts/proxyUsage.awk -v v_Var=%s /var/log/squid3/access.log.1 >> /home/maxg/scripts/pxyUsage.txt\n", arrAddr[i])
}
}
pxyUsage.bash
sudo gawk -f /home/maxg/scripts/proxyUsage.awk -v v_Var=192.168.1.13 /var/log/squid3/access.log.1 >> /home/maxg/scripts/pxyUsage.txt
sudo gawk -f /home/maxg/scripts/proxyUsage.awk -v v_Var=192.168.1.14 /var/log/squid3/access.log.1 >> /home/maxg/scripts/pxyUsage.txt
sudo gawk -f /home/maxg/scripts/proxyUsage.awk -v v_Var=192.168.1.22 /var/log/squid3/access.log.1 >> /home/maxg/scripts/pxyUsage.txt
TheProxyUsage.bash 脚本按计划运行并创建 pxyUsage.bash 脚本。 但是,当脚本运行时,pxyUsage.text 文件不会被修改为最新值。 到目前为止,我自己每天都运行 pxyUsage.bash,因为我无法弄清楚为什么结果没有写入文件。
两个 bash 脚本都设置为执行。实际上文件权限如下:
-rwxr-xr-x 1 maxg maxg 169 Mar 14 08:40 ProxySummary.bash
-rw-r--r-- 1 maxg maxg 910 Mar 15 17:15 proxyUsage.awk
-rwxrwxrwx 1 maxg maxg 399 Mar 17 06:10 pxyUsage.bash
-rw-rw-rw- 1 maxg maxg 2922 Mar 17 07:32 pxyUsage.txt
-rw-r--r-- 1 maxg maxg 781 Mar 16 07:35 uniqueIP.awk
任何提示表示赞赏。谢谢。
最佳答案
sudo(8) 命令需要一个伪终端,而您在 cron(8) 下没有分配伪终端;您确实在以通常方式登录时分配了一个。
与其搞混 sudo(8),不如以正确的用户身份运行脚本。
如果您不能这样做,那么在根 crontab 中,执行如下操作:
su - 用户名/path/to/mycommand arg1 arg2...
这会起作用,因为 root 可以使用 su(1) 而无需输入密码。
关于linux - Bash 脚本没有产生预期的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29087700/