【问题标题】:Bash Script as ScreenSaverBash 脚本作为屏幕保护程序
【发布时间】:2014-08-18 21:40:44
【问题描述】:

我正在尝试创建一个脚本来使用电影作为屏幕保护程序,但是一旦打开电影,系统就会冻结并重新启动。

我一直在拔头发,因为我不知道为什么会发生这种情况。我在另一台机器上尝试了相同的脚本,它运行了好几个月...

它工作的机器是 Linux Mint 13 机器,而它不能工作的机器是 Linux Mint 17 机器。

脚本如下:

#!/bin/bash
screen_on=false;
state=0;
time_idle=1200;

while true;do

IDLE=$(./idletime)


if [ $IDLE -gt $time_idle ];then

    if [ $(pidof mplayer) ];then

        echo "Screen is on " >> mylog.log

    else
        ./test.sh &

    fi

else
    if [ $(pidof mplayer) ];then

        pkill mplayer

    else
        echo "Screen is off." >> mylog.log

    fi

fi

done

idletime程序其实和xprintidle是一样的……它使用X Server来获取系统的空闲时间。 test.sh 脚本如下:

#!/bin/bash

mplayer -nostop-xscreensaver movie.mp4 -fs -loop 0

谢谢!

【问题讨论】:

    标签: linux bash screensaver linux-mint mplayer


    【解决方案1】:

    可能发生的是拒绝服务攻击。

    如果你有两个 mplayer 进程,你的脚本会开始轰炸系统,尽可能快地启动无数个 mplayer。

    使用shellcheck。它会警告您if [ $(pidof mplayer) ] 中缺少引号。正确的代码是:

    if [ "$(pidof mplayer)" ]
    then
      echo "There is one or more mplayer processes"
    else
      echo "There are no mplayer processes."
    fi
    

    可以更直接的写成

    if pidof mplayer > /dev/null
    then 
      ...
    

    PS:您还可以将while true 替换为while sleep 1,这会将脚本的CPU 使用率从100% 降低到

    【讨论】:

    • 我不知道脚本是如何导致这种情况发生的,但是一旦它发生,它绝对会尽可能快地开始生成mplayer 进程。对此使用显式锁定会更好。
    • 除了外部因素外,在后台启动 test.sh 时可能是竞争条件。
    • 是的,while 循环非常贪婪,它绝对可以加速进程生成。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多