13

Running: Xubuntu 14.04 32-bit.

I have read several outdated, not working, working different that I want answers here and elsewhere. I had a script that resulted in shutting my Laptop down at boot time after I set it to autostart.

I also tried it install complexshutdown despite that tool having died in 2011 and has a bug on Lauchpad that his exact option is not available. It not even installed on 14.04 here.

I am looking for a simple straightforward script that is actually tested and working that I can put into the autostart that is doing nothing but checking for activity (mouse/keyboard) and shutting down my laptop if there was none for 2 hours.

Thanks.

Zanna
  • 70,465
redanimalwar
  • 1,550
  • 3
  • 19
  • 35

5 Answers5

10

This is probably the best solution. No need for screensaver tweaking and running.

Install sudo apt-get install xprintidle

Put this script into autostart:

#!/bin/bash

idletime=$((1000*60*60*2)) # 2 hours in milliseconds

while true; do
    idle=`xprintidle`
    echo $idle
    if (( $idle > $idletime )); then
        #sudo shutdown -P now
        dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
    fi
    sleep 1
done

The comments and @Jobin 's answer did lead me to investigate myself again and I actually found a unfinished script with xprinttime but without any loop in the script. Probably not finished this because my linux/bash knowlege was not good at the time. I also did put the script I had in rc.local or something like that triggered the shutdown on boot. Thanks to @Jobin for the reminder how to add startup apps in XFCE, I already knew this but ... and credits for the dbus thing, never saw that, better then shutdown since it not requires root.

redanimalwar
  • 1,550
  • 3
  • 19
  • 35
  • 1
    Actually, it should be 26060*1000? thank you nice to know about xprintidle, simpler script. As 2 hours is a long time you raise sleep delay (60sec or even more). – user.dz May 05 '14 at 22:35
  • I tested counter using while sleep 1; do xprintidle; done , it works perfectly before I Ctrl+C it was 1154009 ~19min. I thought both (as xscreensaver) uses same X server properties/variable. Does xscreensaver works well, does it pop up? – user.dz May 06 '14 at 08:15
  • 1
    Maybe I touched my touchpad without realizing it. Was laying in bed with my laptop at the time ;) It works now. – redanimalwar May 08 '14 at 07:04
  • Where is autostart? – Mohammad Etemaddar May 12 '19 at 14:20
  • Is there a way to do this with traffic over samba or dlna? I want to shutdown my server which I use as a samba-server and as a server for dlna-clients. – bomben Jan 13 '20 at 16:53
  • 1
    @MohammadEtemaddar You have to put the .sh script somewhere and make it executable (chmod +x script.sh). Then create a .desktop file under ~/.config/autostart putting in Exec the path to your .sh script and Terminal=false. I have edited the answer to explain how to properly run the script at startup, hope that the edit will get accepted – robertspierre Feb 24 '21 at 17:29
7

This is an old question but I thought I would answer it with what works for me in Ubuntu 21.04. You can set an IdleAction in your systemd/logind.conf file.

Edit the file using:

sudo nano /etc/systemd/logind.conf

and add:

IdleAction=poweroff
IdleActionSec=120min

I have tested it with IdleActionSec=1min and the machine shuts down as expected.

  • 1
    This is cool and simple, I guess works with every modern distro that uses systemd? Currently, using open SUSE Tumbleweed. - And there are people who hate systemd, it's the Swiss army knife of Linux that actually works. – redanimalwar Jul 27 '21 at 03:37
5

After having looked at a number of options for shutting down after a certain time of inactivity, it seems that xautolock is the easiest way. All credits to Sparhawk for mentioning about xautolock.

Thanks to Sneetsher for pointing out to xscreensaver. Using xscreensaver, I could manually specify what to do after a certain amount of time of inactivity. To use xscreensaver, you need to install it using:

sudo apt-get install xscreensaver

or install it from the software center and then run it once using:

xscreensaver-demo

or type "xscreensaver" on the dash and open "Screensaver".

This will create a ~/.xscreensaver file. Open it and search for the line:

programs:                                                                     \

and add:

dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true \n\

just below the

programs:                                                                     \

line.

You can specify the time after which shutdown should be triggered by changing the line starting with timout. Modify it to

timeout:        2:00:00

to shutdown after two hours.

Have a look at my .xscreensaver file here.

This should poweroff your machine after two hours of inactivity or whatever time you specify in the script.

Notes:

  • Have a look at this question to see how to add xscreensaver on boot.

  • I tried using complex shutdown, but the bug here seems to affect me so could not happen. Otherwise, a graphical application would have been available for this.

  • This could be achieved using xautolock, however, as redanimalwar pointed, out a timout greater than 1 hour is not possible without modifying its source code and recompiling.

jobin
  • 27,708
  • 1
    " -time Specifies the primary timeout interval. The default is 10 minutes, the minimum is 1 minute, and the maximum is 1 hour." – redanimalwar May 05 '14 at 12:29
  • @redanimalwar: My bad, I did not happen to see that. Will check for alternatives. – jobin May 05 '14 at 12:35
  • @redanimalwar: Have modified my answer to use xscreensaver to poweroff, have a look. – jobin May 05 '14 at 13:45
  • Still looking for a better solution then this, I wish the script in my own answer would be working. I will award you the 50 if nothing better comes up or anyway. And you should probably mention that one should set the screensaver to "single" and then select the new command in the list to be used instead of a screensaver in the screensaver settings. You can run the xscreensaver-demo command to bring it up a 2nd time after adding the command. I am curious what mechanism or command the screensaver uses to measure idle time. Maybe I will recompile xautolock, this 1 hour limit makes no sense to me. – redanimalwar May 06 '14 at 05:49
  • @redanimalwar: I am able to poweroff even if the screensaver is "random" and not "single". Why do you want it to be set to "single"? – jobin May 07 '14 at 12:19
  • Well I actually never tested it that way and am curious how this works. Isnt it supposed to run a random screensaver? When you add a new one to the list? By that logic it should only shutdown with luck. Anyway my way better solution seems to work now and apart from me never liking (ab)using the screensaver for this. My solution is much better and something I was looking for. – redanimalwar May 08 '14 at 08:52
  • @redanimalwar: The first command that runs in your xscreensaver file is for shutdown, so the other commands would be ignored, no matter what you have placed. – jobin May 08 '14 at 15:23
  • Still not getting it. Why is it run? Isn't it just a list of screensavers (commands) to be used by random or selected? Anyway both solutions work fine. Despite me saying "I don't mind using screensaver" I actually disliked it once I saw it, because the manual setup, the manual put to autostart, despite XFCE having the screensaver settings in place (thats would be a question for the XFCE ppl) and also because I not really understand it. Enjoy +50 ;) – redanimalwar May 08 '14 at 18:25
2

This is my simplified script, this requires that you install the "xprintidle" package and modify the shutdown command so that is possible to run without sudo/password.

sudo chmod u+s /sbin/shutdown
sudo apt-get install xprintidle

Script

#!/bin/bash
idletime=$((15*60*1000)) # 15 min in milliseconds
idle=0

while [ $idle -lt $idletime ];do
    idle=`xprintidle`
    sleep 1
done
shutdown -P now
1

Modified @redanimalwar script to warn user and give a chance to cancel the shutdown. For tests, it is using 3 seconds and a simple message. Please adjust for your tastes. HTH.

#!/bin/bash
#https://askubuntu.com/questions/442795/
#http://ubuntuforums.org/showthread.php?t=2172828

function showProgress(){
#
# Force Zenity Status message box to always be on top.
sleep 1 && wmctrl -r "Progress Status" -b add,above &

(
echo "# Shutting Down in 5" ; sleep 2
echo "25"
echo "# Shutting Down in 4" ; sleep 2
echo "50"
echo "# Shutting Down in 3" ; sleep 2
echo "75"
echo "# Shutting Down in 2" ; sleep 2
echo "99"
echo "# Shutting Down in 1" ; sleep 2
echo "# Shutting Down now" ; sleep 2
echo "100"

) |
zenity --progress \
  --title="Progress Status" \
  --text="First Task." \
  --percentage=0 \
 --auto-close

return $?

}


#idletime=$((1000*60*60*2)) # 2 hours in milliseconds
idletime=$((1000*3)) # test, 3seconds

while true; do
    idle=`xprintidle`
    echo $idle
    if (( $idle > $idletime )); then
        showProgress && \
        #sudo shutdown -P now
        #dbus-send --system --print-reply --dest=org.freedesktop.login1 /org/freedesktop/login1 "org.freedesktop.login1.Manager.PowerOff" boolean:true
        #echo for tests. use command above to actually shutdown
        echo shuting down the system. Just kidding  ^_^ \
        && exit 0
    fi
    sleep 1
done