【问题标题】:Running Selenium job using crond in GKE在 GKE 中使用 cron 运行 Selenium 作业
【发布时间】:2017-08-08 04:10:30
【问题描述】:

我的docker文件截图如下:

#Assume i have ubuntu, selenium and chrome driver in the image

ADD crontab /etc/cron.d/simple-cron
# Add crontab file in the cron directory
ADD crontab /etc/cron.d/simple-cron

# Add shell script and grant execution rights

RUN wget myjava.jar [From some central repository]
RUN chmod +x /myjava.jar


ADD script.sh /script.sh
RUN chmod 777 /script.sh

# Give execution rights on the cron job
RUN chmod 0644 /etc/cron.d/simple-cron

# Create the log file to be able to run tail
RUN touch /var/log/cron.log


ADD run.sh /run.sh
RUN chmod +x /run.sh
CMD ["/run.sh"]



Crontab:
* * * * * root /script.sh

script.sh:
export DISPLAY=:99
cd /
/usr/bin/java -jar myjava.jar >> /var/log/cron.log 2>&1

run.sh:
#!/bin/bash
Xvfb :99 -screen 0 1024x768x16 &
cron && tail -f /var/log/cron.log

问题:我已经在 GKE 容器中部署了上面的镜像。

根据上述配置,我的 cron 作业应该每 1 分钟运行一次。但由于某种原因,我没有看到 cron 作业被调用。

我在这里有什么遗漏吗?这可能是由于后台显示缓冲区“xvfb”进程和cron进程在同一个pod中运行吗?

在我的本地 docker 容器中下载图像时,我看到 cron 运行良好,我没有看到任何问题。仅当由于某种原因将映像部署到 GKE 时,cron 才不会执行 script.sh

我已经在我的 GKE 容器上安装了 strace,当执行 strace cron 时,我看到以下日志:

/# strace cron
execve("/usr/sbin/cron", ["cron"], [/* 33 vars */]) = 0
brk(NULL)                               = 0xff8000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffa0cec0000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=30704, ...}) = 0
mmap(NULL, 30704, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7ffa0ceb8000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libpam.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\200$\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=55904, ...}) = 0
mmap(NULL, 2150888, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0ca8f000
mprotect(0x7ffa0ca9c000, 2093056, PROT_NONE) = 0
mmap(0x7ffa0cc9b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xc000) = 0x7ffa0cc9b000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libselinux.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260Z\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=130224, ...}) = 0
mmap(NULL, 2234080, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0c86d000
mprotect(0x7ffa0c88c000, 2093056, PROT_NONE) = 0
mmap(0x7ffa0ca8b000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1e000) = 0x7ffa0ca8b000
mmap(0x7ffa0ca8d000, 5856, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffa0ca8d000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\3\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0P\t\2\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=1868984, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffa0ceb7000
mmap(NULL, 3971488, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0c4a3000
mprotect(0x7ffa0c663000, 2097152, PROT_NONE) = 0
mmap(0x7ffa0c863000, 24576, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1c0000) = 0x7ffa0c863000
mmap(0x7ffa0c869000, 14752, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffa0c869000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libaudit.so.1", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\0*\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=117288, ...}) = 0
mmap(NULL, 2253352, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0c27c000
mprotect(0x7ffa0c298000, 2093056, PROT_NONE) = 0
mmap(0x7ffa0c497000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b000) = 0x7ffa0c497000
mmap(0x7ffa0c499000, 37416, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffa0c499000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libdl.so.2", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\240\r\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=14608, ...}) = 0
mmap(NULL, 2109680, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0c078000
mprotect(0x7ffa0c07b000, 2093056, PROT_NONE) = 0
mmap(0x7ffa0c27a000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x2000) = 0x7ffa0c27a000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libpcre.so.3", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0000\25\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=456632, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffa0ceb6000
mmap(NULL, 2552072, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0be08000
mprotect(0x7ffa0be76000, 2097152, PROT_NONE) = 0
mmap(0x7ffa0c076000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x6e000) = 0x7ffa0c076000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libpthread.so.0", O_RDONLY|O_CLOEXEC) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\260`\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0755, st_size=138696, ...}) = 0
mmap(NULL, 2212904, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7ffa0bbeb000
mprotect(0x7ffa0bc03000, 2093056, PROT_NONE) = 0
mmap(0x7ffa0be02000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x17000) = 0x7ffa0be02000
mmap(0x7ffa0be04000, 13352, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7ffa0be04000
close(3)                                = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffa0ceb5000
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7ffa0ceb3000
arch_prctl(ARCH_SET_FS, 0x7ffa0ceb3800) = 0
mprotect(0x7ffa0c863000, 16384, PROT_READ) = 0
mprotect(0x7ffa0be02000, 4096, PROT_READ) = 0
mprotect(0x7ffa0c076000, 4096, PROT_READ) = 0
mprotect(0x7ffa0c27a000, 4096, PROT_READ) = 0
mprotect(0x7ffa0c497000, 4096, PROT_READ) = 0
mprotect(0x7ffa0ca8b000, 4096, PROT_READ) = 0
mprotect(0x7ffa0cc9b000, 4096, PROT_READ) = 0
mprotect(0x609000, 4096, PROT_READ)     = 0
mprotect(0x7ffa0cec2000, 4096, PROT_READ) = 0
munmap(0x7ffa0ceb8000, 30704)           = 0
set_tid_address(0x7ffa0ceb3ad0)         = 129
set_robust_list(0x7ffa0ceb3ae0, 24)     = 0
rt_sigaction(SIGRTMIN, {0x7ffa0bbf0b50, [], SA_RESTORER|SA_SIGINFO, 0x7ffa0bbfc390}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0x7ffa0bbf0be0, [], SA_RESTORER|SA_RESTART|SA_SIGINFO, 0x7ffa0bbfc390}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM64_INFINITY}) = 0
statfs("/sys/fs/selinux", 0x7ffc94589100) = -1 ENOENT (No such file or directory)
statfs("/selinux", 0x7ffc94589100)      = -1 ENOENT (No such file or directory)
brk(NULL)                               = 0xff8000
brk(0x1019000)                          = 0x1019000
open("/proc/filesystems", O_RDONLY)     = 3
fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
read(3, "nodev\tsysfs\nnodev\trootfs\nnodev\tr"..., 1024) = 285
read(3, "", 1024)                       = 0
close(3)                                = 0
rt_sigaction(SIGCHLD, {0x403190, [CHLD], SA_RESTORER|SA_RESTART, 0x7ffa0c4d84b0}, {SIG_DFL, [], 0}, 8) = 0
rt_sigaction(SIGHUP, {0x403170, [HUP], SA_RESTORER|SA_RESTART, 0x7ffa0c4d84b0}, {SIG_DFL, [], 0}, 8) = 0
fcntl(0, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
open("/var/run/crond.pid", O_RDWR|O_CREAT, 0644) = 3
fcntl(3, F_GETFL)                       = 0x8002 (flags O_RDWR|O_LARGEFILE)
flock(3, LOCK_EX|LOCK_NB)               = 0
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 4
fstat(4, {st_mode=S_IFREG|0644, st_size=127, ...}) = 0
fstat(4, {st_mode=S_IFREG|0644, st_size=127, ...}) = 0
read(4, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0"..., 4096) = 127
lseek(4, -71, SEEK_CUR)                 = 56
read(4, "TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0"..., 4096) = 71
close(4)                                = 0
socket(PF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 4
connect(4, {sa_family=AF_LOCAL, sun_path="/dev/log"}, 110) = -1 ENOENT (No such file or directory)
close(4)                                = 0
fcntl(3, F_SETFD, FD_CLOEXEC)           = 0
fstat(3, {st_mode=S_IFREG|0644, st_size=3, ...}) = 0
lseek(3, 0, SEEK_SET)                   = 0
write(3, "129\n", 4)                    = 4
lseek(3, 0, SEEK_CUR)                   = 4
ftruncate(3, 4)                         = 0
setresuid(-1, 0, -1)                    = 0
stat("/var/spool/cron", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
chdir("/var/spool/cron")                = 0
stat("crontabs", {st_mode=S_IFDIR|S_ISVTX|0730, st_size=4096, ...}) = 0
clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7ffa0ceb3ad0) = 130

【问题讨论】:

  • 顶部是 docker 文件,下面你运行 shell 脚本运行 cron。您在哪里构建 docker 映像。运行情况如何?
  • 我正在使用标准 docker 命令来构建映像并将其部署到 GKE。

标签: docker kubernetes google-kubernetes-engine


【解决方案1】:

问题可能是您的 cron 工作行不正确。你需要像这样添加它。

假设您的脚本完整路径是 /root/setup.sh。你的 cron 条目应该是这样的。

Crontab:

* * * * * /root/script.sh

也尝试给出你的 jar 文件的完整路径名myjava.jar 并测试它。

谢谢

【讨论】:

  • 我的 script.sh 完整路径是 /script.sh。所以路径是正确的。如果 myjava.jar 路径不正确,至少我应该在 /var/log/crontab.log 中看到一些错误。当我在本地 docker 容器上运行时,同样的图像也可以正常工作。不确定我部署到 GKE 时会发生什么。
  • 你的格式我看到* * * * * root /script.sh 这样这不是 contab 的正确格式。改成* * * * * /script.sh
  • 我试过 * * * * * /script.sh。我没有看到 cron 被触发。
  • 当我手动触发时,它确实有效。我已经了解了 cron。那个痕迹有什么问题吗?
  • 跟踪输出对我来说看起来很正常。有些当我们运行 crontab 环境变量时会丢失。看到这个脚本使用 at 命令运行。 at now 输入并输入脚本的完整路径名,然后 control+d。脚本运行与 cron 相同的模式。
猜你喜欢
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2014-07-22
  • 2018-06-25
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多