Ubuntu 20.04下root用户Cron调用脚本时ffmpeg无法打开display :0.0
Ubuntu 20.04下Root Cron调用FFmpeg脚本报错解决
问题现象
在Ubuntu 20.04系统中,root用户的Cron任务执行包含ffmpeg的截图脚本时,ffmpeg抛出如下错误:
No protocol specified, Cannot open display :0.0
但以下场景脚本均可正常运行:
- 手动以root身份执行脚本
- 普通用户通过
sudo运行脚本 - 普通用户的Cron任务运行脚本
已尝试在脚本中设置export DISPLAY=":0"、export DISPLAY=":0.0"、export DISPLAY=":1",问题仍未解决。
相关脚本与日志
脚本内容
#!/bin/bash log=/var/log/log2/log2.txt echo ______________ $(date) >> \"$log\" echo \"$\"\"DISPLAY\" \"= \" \"$DISPLAY\" >> \"$log\" ; echo whoami ' ' $(whoami) >> \"$log\" echo pwd ' ' $(pwd) >> \"$log\" echo \"$\"\"USER\" \"=\" ' ' \"$USER\" >> \"$log\" echo PATH ' ' \"$PATH\" >> \"$log\" echo which ffmpeg ' ' $(which ffmpeg)>> \"$log\" echo whereis ffmpeg ' ' $(whereis ffmpeg) >> \"$log\" echo \"\nls -l /bin/* | grep ffmpeg\" ' ' >> \"$log\" ls -l /usr/bin/* | grep ffmpeg >> \"$log\" echo \"ls -l /var/log | grep log2\" ' '>> \"$log\" ls -l /var/log | grep log2 >> \"$log\" ffmpeg -y -f x11grab -s 1366x768 -i :0.0 -r 25 /var/log/log2/test.mp4 -loglevel error 2>>\"$log\" & echo \"pid ffmpeg \"\"$\"\"!\"\" = \" \"$!\" >> \"$log\" sleep 5 kill \"$!\" echo exit >> \"$log\" exit
root用户Cron运行日志
______________ ven. 05 mai 2023 04:10:01 CEST $DISPLAY = whoami root pwd /root $USER = PATH /usr/bin:/bin which ffmpeg /usr/bin/ffmpeg whereis ffmpeg ffmpeg: /usr/bin/ffmpeg /usr/share/ffmpeg /usr/share/man/man1/ffmpeg.1.gz ls -l /usr/bin/* | grep ffmpeg -rwxr-xr-x 1 root root 284976 mai 18 2022 /usr/bin/ffmpeg ls -l /var/log | grep log2 drwxrwxrwx 2 root root 4096 mai 5 04:09 log2 pid ffmpeg $! = 74590 No protocol specified [x11grab @ 0x56244aa06740] Cannot open display :0.0, error 1. :0.0: Input/output error exit
手动root运行日志
______________ ven. 05 mai 2023 04:11:27 CEST $DISPLAY = :0 whoami root pwd /root $USER = root PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin which ffmpeg /usr/bin/ffmpeg whereis ffmpeg ffmpeg: /usr/bin/ffmpeg /usr/share/ffmpeg /usr/share/man/man1/ffmpeg.1.gz ls -l /usr/bin/* | grep ffmpeg -rwxr-xr-x 1 root root 284976 mai 18 2022 /usr/bin/ffmpeg ls -l /var/log | grep log2 drwxrwxrwx 2 root root 4096 mai 5 04:11 log2 pid ffmpeg $! = 74683 exit
普通用户Cron运行日志
$DISPLAY = whoami an pwd /home/an $USER = PATH /usr/bin:/bin which ffmpeg /usr/bin/ffmpeg whereis ffmpeg ffmpeg: /usr/bin/ffmpeg /usr/share/ffmpeg /usr/share/man/man1/ffmpeg.1.gz ls -l /usr/bin/* | grep ffmpeg -rwxr-xr-x 1 root root 284976 mai 18 2022 /usr/bin/ffmpeg ls -l /var/log | grep log2 drwxrwxrwx 2 root root 4096 mai 5 05:05 log2 pid ffmpeg $! = 77601 exit
问题分析
从日志对比可以明确核心原因:
- root Cron环境中
$DISPLAY为空,但手动设置DISPLAY后仍报错,说明不是变量缺失的问题 - X11显示系统默认限制非当前登录用户访问,即使是root,也需要获取X授权文件(
.Xauthority)的访问权限,才能连接到显示设备
解决步骤
1. 给root授权访问X11显示
在当前登录的普通用户终端执行以下命令,临时允许root访问当前X显示:
xhost +SI:localuser:root
如果需要永久生效,将上述命令添加到普通用户的~/.xprofile文件中,这样每次用户登录时都会自动完成授权。
2. 在脚本中配置DISPLAY和XAUTHORITY
在脚本开头添加以下两行,指定显示设备和X授权文件路径(替换an为实际登录的普通用户名):
export DISPLAY=:0 export XAUTHORITY=/home/an/.Xauthority
修改后的脚本开头示例:
#!/bin/bash export DISPLAY=:0 export XAUTHORITY=/home/an/.Xauthority log=/var/log/log2/log2.txt # 后续原有脚本内容...
3. 验证Cron任务
重新部署root的Cron任务,等待执行后查看日志,ffmpeg即可正常捕获X显示内容。
内容的提问来源于stack exchange,提问作者a k
相关产品推荐
相关产品推荐

