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.