autosleep



  • Anläßlich meiner neuen Tastatur Ozone Battle Strike musste ich mein autosleep-Script umschreiben…

    Da isses, vielleicht hat jemand ja ähnliche Vorlieben wie ich und mag es verwenden. Also ich mag es. Es läßt meinen Rechner einschlafen total oft, aber nie, daß es nervt.
    Dazu gehört natürlich, daß die Tastatur unter Strom bleibt und den Rechner aufweckt, wenn man eine Taste drückt.

    main.cpp:

    #include <iostream>
    #include <fstream>
    #include <unistd.h>
    #include <poll.h>
    #include <algorithm>
    #include <syslog.h>
    #include <inttypes.h>
    
    using namespace std;
    
    class Stat{
    	private:
    		char const* file;
    		char const* key;
    		int index;
    		uint64_t value;
    		uint64_t read(){
    			ifstream in(file);
    			string readKey;
    			while(in>>readKey){
    				if(readKey==key){
    					int pos=0;
    					uint64_t readVal;
    					while(in>>readVal){
    //						cout<<pos<<' '<<readVal<<'\n';
    						if(pos==index)
    							return readVal;
    						++pos;
    					}
    				}
    			}
    			return 0;
    		}
    	public:
    		Stat(char const* file,char const* key,int index)
    		:file(file),key(key),index(index){
    			value=read();
    		}
    		uint64_t operator()(){
    			uint64_t old=value;
    			value=read();
    			return value-old;
    		}
    };
    
    double loadavg(){
    	ifstream in("/proc/loadavg");
    	double value;
    	in>>value;
    	return value;
    }
    
    int main(){
    	openlog ("autosleep", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_LOCAL1);
    //	Stat keyboard("/proc/stat","intr",2);
    	Stat input("/proc/stat","intr",17);
    //	Stat eth0("/proc/net/dev","enp2s0:",0);
    	Stat net("/proc/net/dev","enp2s0:",0);
    	int left=1*60;
    	for(;;){
    		int step=left/10+1;
    //		cout<<"sleep("<<step<<")\n";
    		sleep(step);
    		left-=step;
    //		cout<<keyboard()<<'\n';
    //		cout<<mouse()<<'\n';
    //		cout<<loadavg()<<'\n';
    		uint64_t netavg=net()/step;
    		int newLeft=[&](){
    			if(input()) return 5*60;
    			//if(loadavg()>0.6 or netavg>18000) return 5*60;//video
    			if(netavg>50000) return 60;//download
    			if(loadavg()>1) return 10;//compilejob
    			return 0;
    		}();
    		left=max(left,newLeft);
    //		cout<<netavg<<' '<<loadavg()<<' '<<newLeft<<'\n';
    		syslog (LOG_INFO, "netavg:%" PRIu64 " loadavg:%f left:%d",netavg,loadavg(),left);
    		if(left==0){
    			//ofstream("/tmp/autosleep")<<netavg<<' '<<loadavg()<<' '<<newLeft<<'\n';
    			ofstream("/sys/power/state")<<"mem";
    			left=1*60;
    		}
    	}
    }
    

    /etc/systemd/system/autosleep.service

    [Unit]
    After=systemd-user-sessions.service
    
    [Service]
    ExecStart=/usr/local/sbin/autosleep
    
    [Install]
    WantedBy=multi-user.target
    

    /usr/local/sbin/autosleep

    //die übersetzte main.cpp halt
    

    Mit

    watch -D cat /proc/stat
    

    halt nachschauen, wo die eigene Maus und Tastatur die Zahlen ändern und den Namen der Netzwerkkarte anpassen.



  • Cool, danke. Ich habe auch mal was ähnliches zurechtgehackt; demnächst mal wieder ausgraben und nachsehen, ob ich direkt deines verwenden oder irgendwelche Einzelheiten stehlen kann. 👍


Anmelden zum Antworten