You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

问题分析

从日志对比可以明确核心原因:

  1. root Cron环境中$DISPLAY为空,但手动设置DISPLAY后仍报错,说明不是变量缺失的问题
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 20:17:02