[ERLEDIGT/DISKUSSION] Shell Script im Deep Sleep

K

ka111

Neues Mitglied
1
Weiss jemand wie ich ein Shell Script im Standby / Deep Sleep (oder was passiert wenn ich den Power Knopf drücke) weiter laufen lassen kann? Es stoppt immer.
Also ich will eine Zeit lang in den Standby (um Strom zu sparen), und dann wieder aufwecken. Sleep zählt aber im Standby nicht weiter.
Weiss jemand eine (einfache) Lösung?
 
Bei mir funktioniert das irgendwie nicht (mit android 6.0.1). Wenn ich das richtig verstanden habe müsste ich einen Befehl nur mit nohup im Hintergrund laufen lassen und sollte dann das Smartphone ausschalten können (nicht ganz, nur so schwarz). Aber sobald ich es dann ausschalte stoppt der Befehl.

Weiss jemand wieso es nicht geht?
 
Womit führst du denn den Shell überhaupt aus ?
 
Mit einem Terminal Emulator. Liegt es vielleicht daran dass dieser Terminal Emulator nicht im Hintergrund läuft? Es sollte doch aber den Befehl mit nohup von dem Terminal entkoppeln so dass ich ihn schliessen könnte?
 
Mit einem Terminal Emulator. Liegt es vielleicht daran dass dieser Terminal Emulator nicht im Hintergrund läuft? Es sollte doch aber den Befehl mit nohup von dem Terminal entkoppeln so dass ich ihn schliessen könnte?

Genau aus diesem Grunde hatte ich nachgefragt.
Wenn du was im Hintergrund laufen lassen möchtest, wirst du um einen Service nicht drumrum kommen
 
Nein :( wie mach ich das? Geht das irgendwie mit Shell?
Könnte ich auch alternativ mit einem Shell Befehl einen Wecker stellen?
Und was ist mit rtcwake, das funktioniert bei mir nicht so richtig auf dem Smartphone, es wartet immer nur ca 5 Sekunden, egal welche Zeit ich angebe.
 
Hallo,

nun Android hat seine Eigenschaften , die nicht vergleichbar mit einem "normalen" System sind.
Z.B. gibt es den LifeCycle - der bestimmt von sich aus , welche App das Sagen hat und welche vom System
entfernt, bzw beendet wird.
So was hat auch der Entwickler nicht im Griff und auch keinen Einfluss drauf.

Abhilfe ist dann nur ein Service- der aber auch vom System beendet werden kann , aber nur unter bestimmten Umständen.

wie mach ich das?

Das geht nur mit fundierten Kenntnissen in Android/resp Java oder Native-C Programmierung.
 
Ok, das sieht nicht so gut aus.
Aber ich habe über cron gelesen dass es ein Daemon ist, und vor kurzem habe ich irgendwo gelesen dass ein Daemon in Android so etwa ein Service ist :smile: Und auf meinem Smartphone (gerootet mit busybox) habe ich die Befehle crond und crontab. Aber sie funktionieren nicht.
Bei crontab kommt immer "unknown uid 0" (ausser bei crontab -h) und nach "crond -b -c /data/crontab/root" kriege ich mit "pgrep crond" keine Nummer (crontab/root habe ich selbst erstellt im Terminal).

Weisst du (oder jemand anders) wie ich cron unter Android benutzen kann?
 
Was willst du denn ausführen? Vielleicht hilft dir ja der AlarmManager.
 
Ich wollte ein Script machen das mich mit längeren Vibrations-Intervallen weckt als wenn ich einen Wecker nur mit Vibration stelle. Und es sollte von einem anderen Script aufgerufen werden können.
Aber auch sonnst hatte ich immer wieder mal das Problem dass Shell Scripte nicht mehr weiter liefen sobald ich den Bildschirm ausschalte.

Beim AlarmManager komme ich überhaupt nicht draus. Ich weiss nicht was ich mit dem Code anfangen soll, es sieht ein bisschen wie Python aus, aber wo wie hinein schreiben und ausführen verstehe ich nicht. Kann man solche Sachen überhaupt mit dem Terminal machen oder brauche ich dazu immer so etwas wie Eclipse?
 
Also wieso es bei deinem UseCase ein Shell Script sein muss weiß ich nicht.
Aber wenn du eine normale App programmierst, kannst du über den Alarmmanger einen Zeitpunkt erstellen, indem Code ausgeführt wird.
Also kann man auch einen Wecker nachprogrammieren.

Bei einem Projekt von mir habe ich dann einen NotificationService geschrieben und dort kann man sogar die Vibrationsdauer und Rythmus einstellen.

Hier mein Code für die Vibration:
Code:
 Notification noti = new Notification.Builder(this)
                .setContentTitle("Titel")
                .setContentText("KurzText").setSmallIcon(R.drawable.appicon).setDefaults(Notification.DEFAULT_SOUND).setVibrate(new long[]{100, 200, 100, 500})
                .setContentIntent(pendingNotificationIntent).getNotification();

setVibrate(new long[]{100, 200, 100, 500}) ist hier das wichtige.
Wenn ich es noch richtig weiß, müsste es jetzt so vibrieren: 100ms delay, 200ms Vibrieren, 100ms Pause, 500ms vibrieren.
 
  • Danke
Reaktionen: swa00
crontab -e würd ich mal versuchen.
Dann muss cron als root user ausgeführt werden. (Wenn du eh root Rechte hast - schreibs in die init.rc oder so dann startets automatisch)
Ich kann mich dunkel daran erinnern das cron auf dem Nexus schon zickig war. Guck mal dort vll bringt dich das weiter: [Enable Cron for Android Phones]

Wenn du nen Service mit Java schreiben willst - so schwer ist das jetzt auch nicht...
 
@Kardroid
Ich kann nur Shell Scripting...
Danke für den Code, vielleicht probier ich ihn später einmal aus wenn ich gelernt habe wie man Apps entwickelt.

@Cynob
Ich habe jetzt cron nach dieser Anleitung imoseyon: cron on android is awesome zum laufen gebracht, nur 7. mit der Zeitzone habe ich ausgelassen. Aber sobald ich den Bildschirm ausschalte funktioniert auch cron nicht mehr, auch mit der Option -b nicht (und root Rechten).

Zu der Anleitung habe ich ein paar Fragen:

1. Wenn ich /etc/passwd erstelle in android, hat das dann sonnst irgend einen Einfluss oder ist diese Datei vollkommen nutzlos in Android? Wird mein Smartphone damit irgendwie angreifbarer? Es ist ja nicht einmal die Datei /etc/shadow vorhanden in der irgend ein Passwort verschlüsselt stehen sollte.

2. Wenn ich die Zeitzone mit tz=??? setze, ist das nach dem Neustart wieder so gesetzt wie vorher oder ist das dann für immer so gespeichert?
Und macht das überhaupt einen Unterschied ob ich die Zeitzone so setze oder einfach in den Einstellungen auswähle (Es hiess in der Anleitung die neuen Olson Zeitzonen funktionieren nicht)?
Welche Zeit müsste ich dann setzen mit tz=, wenn in den Einstellungen die Zeitzone GMT+01:00 Mitteleuropäische Normalzeit steht und der Befehl "date" CET anzeigt?
Kann das überhaupt an der Zeitzone liegen wenn es mit eingeschaltetem Display funktioniert?
 
@Cynob
Bevor Du weitermachst, zwei Anmerkungen zu deinen Vorhaben. Google hat sehr viel Arbeit in die Stromsparmodus gesteckt. Ich glaube nicht, dass dein Skript die Wende bringt. Eher verbraucht dein Skript noch zusätzlich Strom.
Im schlimmsten Fall beschädigst du Dein Handy, wenn du nicht wirklich weißt, was da tust. Als Root-User stützt Dich nichts vor Fehlern.
Benutze lieber eine WeckerApp, oder schreibe eine eigene App (Ist nicht so schwer - außerdem lohnt es sich immer mal eine zweite Programmiersprache zu lernen).
 
@markus.tullius : Ich überlese deinen Beitrag einfach mal - das rumgeheule in diesem Forum geht mir so langsam aber sicher auf den Senkel.

@ka111 :
Die /etc/passwd macht auf nem Android Gerät nix da diese nicht ausgelesen oder verwendet wird. Unter Linux werden da ja z.b. das Passwort für Root hinterlegt. Da ne Android su binary aber ohne ne Passwortabfrage startet nutzt die /etc/passwd so oder so nichts ( das ist bei Android einfach nicht verarbeitet/verwendet wird). Du brauchst dir sicher nicht um eine Datei Sorgen machen welche möglicherweise ein Passwort enthält welches gar nicht abgefragt wird. Wenn du noch mehr darüber lesen möchtest wie das in einem Linux System arbeitet: Benutzer- und Berechtigungskonzepte unter Linux

Das Problem was du has ist nicht die tz (timezone)t: Android nimmt alles was irgendwo als "Benutzer" gestartet wird und beendet es wenn das Display ausgeht. Du startest cron z.B. durch den Terminal Emulator > dieser wird beim Display-off angehalten und reißt somit cron in den Abgrund.
Die Lösung: Cron als service laufen lassen.
Da man da aber am System rumfummelt wäre es echt sinnvoll vorher n Backup des boot.img zu haben ( und dieses auch wieder einspielen zu können)
Oder halt ne update.zip mit der original Datei.... da kann man ja kreativ sein *hust*) Das mit dem flashbaren boot.img wäre insofern nicht schlecht da man das image auf dem PC entpacken könnte - seine änderungen einbringen - und wieder packen. somit hätte man zwei Dateien mit welchen man switchen kann so oft man will. Die quick&dirty Version wäre: boot.img backup ziehen - direkt das laufende System ändern und neustarten.

Also ich würde ( wenn man mit dem Linux part von Android arbeiten möchte)

mir im root Verzeichnis / einen Ordner anlegen (nennen wir ihn mycron)

dann in /mycron n Script anlegen ( Benutzer und Ausführungsrechte beachten)
ich nenns jetzt mal startcron
dort kommt rein:
Code:
#! /system/bin/bash
#crontab startbefehl der ja jetzt schon mit display on läuft
crond blablabla...

So jetzt wenden wir uns der init.rc zu

dort suchst du nach:

Code:
## Daemon processes to be run by init.
##

In der Sektion gehst du weiter runter bis so ziemlich alles geladen wurde - bei mir sind die letzten zwei Einträge der start von logd - da davor würde ich einfügen:

Code:
service startmycron /mycron/startcron
    class main
    user root

Je nach dem ob bei deinem System SELinux aktiv ist oder sowas müssten die Starteinstellungen noch ein wenig angepasst werden. ( Ab hier ist es dann beruhigend ein Backup zu haben :D )

Ok weiter - wenn der Eintrag erstellt ist sucht man weiter oben nach: "on boot" darunter kommt irgendwo ein "class_start core"

so erweitern:

Code:
.....

    class_start core
    start startmycron

on nonen.....

Wenn du Windows zum bearbeiten verwenden musst - benutze einen Texteditor wie Notepad+ - Windows zerschiesst dir sonst die Zeilenumbrüche!


So jetzt gibts noch die andere Möglichkeit ( wenn man Java verwenden möchte:

Man holt sich von githup nen open source Wecker: GitHub - SheldonNeilson/Android-Alarm-Clock: A simple android alarm clock application that requires that you solve a math problem to deactivate the alarm.

Lädt das Geraffel in Android Studio - öffnet die AlarmAlertActivity.java

springt zu Zeile 148

dort findet man:

Code:
    private void startAlarm() {

        if (alarm.getAlarmTonePath() != "") {
            mediaPlayer = new MediaPlayer();
            if (alarm.getVibrate()) {
                vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
                long[] pattern = { 1000, 200, 200, 200 };
                vibrator.vibrate(pattern, 0);
            }
            try {
                mediaPlayer.setVolume(1.0f, 1.0f);
                mediaPlayer.setDataSource(this,
                        Uri.parse(alarm.getAlarmTonePath()));
                mediaPlayer.setAudioStreamType(AudioManager.STREAM_ALARM);
                mediaPlayer.setLooping(true);
                mediaPlayer.prepare();
                mediaPlayer.start();

            } catch (Exception e) {
                mediaPlayer.release();
                alarmActive = false;
            }
        }

    }

Ich hab den Code jetzt nicht komplett gelesen aber ich will mal behaupten das

long[] pattern = { 1000, 200, 200, 200 };

Die Vibrationsfrequenz definiert. Also nach belieben ändern - kompilieren und testen ( Studio hat auch n Emulator für den Spass)

So ich hol mir jetzt n Kaffee....
 
Zuletzt bearbeitet:
@Cynob
Ich überlese deinen Beitrag einfach mal - das rumgeheule in diesem Forum geht mir so langsam aber sicher auf den Senkel.

Was meinst du mit unserem "rumgeheule?" :)
(Das interessiert mich jetzt doch einmal ) :)
 
Ok das kam wohl etwas zu negativ rüber. Ich mag diese "Lass blos die Finger davon - es könnte ja eventuell etwas schiefgehen" Haltung nicht welche man hier irgendwie viel zu oft liest. Wie soll man sonst etwas dazulernen wenn man sich nicht traut was zu verändern :)

@Markus: wenn du das Objekt meinst was ich gepostet hab - das ist ja nur die Methode welche aufgerufen wird- ich nehm jetzt schon mal stark an das die Wecker apk von dem Sheldon im Prinzip lauffähig ist
 
Ok das kam wohl etwas zu negativ rüber.

Das habe ich auch nicht so aufgefasst und etxra darauf geachtet, dass ich zwei Smilies verwendet habe .... :) <- da iss noch Einer.

Auch ich habe absolut nichts dagegen , mal einen anderen Weg auszuprobieren , ich lese ja hier aufmerksam mit.

Das was er allerdings vorhat (Scripts) , ist nun mal nicht so dauerhaft umsetzbar, weil ihm halt Android da einen Strich durch die Rechnung macht.
(GC & LiveCylce) - Und auf die Dauerhaftigkeit resp Zuverlässigkeit kommt es ihm ja grundsätzlich an .

Dann ist es doch besser , man "nölt" vorher rum und weist darauf hin .....

Es sein denn , er verbiegt das gesamte Image - dann ist es aber kein Android mehr, sondern ein Barren mit Linux

P.S dein GitHub Beispiel verwendet auch einen Service - also kommen wir im Prinzip wieder zum Ausgangspunkt zurück.
 
Zuletzt bearbeitet:

Ähnliche Themen

D
  • djsnoopy
Antworten
6
Aufrufe
613
djsnoopy
D
dimoll
  • dimoll
Antworten
3
Aufrufe
1.298
chrs267
chrs267
S
Antworten
8
Aufrufe
508
swa00
swa00
Zurück
Oben Unten