schleife auf der shell bringt fehler

Lord_Icon

Blog Benutzer
#1
Code:
for ((i=0; i<=5; i++ )); do ps -ef | grep rsh | grep -v grep | awk '{print $2}' | xargs kill; done
bringt im Cronjob immer:
Code:
/bin/sh: 1: Syntax error: Bad for loop variable
weiß einer warum ?
Code:
ps -ef | grep rsh | grep -v grep => bringt aktuell keine Treffer. kann es sein, dann der kill befehl zwingend eine PID benötigt ?
Führe ich es händisch auf der Shell aus, kommt:

Code:
Usage:
 kill [options] <pid> [...]

Options:
 <pid> [...]            send signal to every <pid> listed
 -<signal>, -s, --signal <signal>
                        specify the <signal> to be sent
 -l, --list=[<signal>]  list all signal names, or convert one to a name
 -L, --table            list all signal names in a nice table

 -h, --help     display this help and exit
 -V, --version  output version information and exit

For more details see kill(1).
Danke für Tipps !!!
 

killerbees19

★ ①③ ④ⓑ ✛ ␀
#2
Du führst es manuell wahrscheinlich mit /bin/bash aus. Bei /bin/sh erhalte ich die gleiche Fehlermeldung. Prinzipiell würde Dir dieser Tipp helfen. Zusätzlich noch ein --no-run-if-empty bei xargs würde auch nicht schaden…

Allerdings weiß ich nicht, warum Du es so verkomplizierst? Um alle rsh-Prozesse zu beenden, reicht auch folgender Einzeiler:
Bash:
kill `pidof rsh`
Damit keine Fehler ausgeworfen werden, wenn kein Prozess läuft, könnte man entweder STDERR ins Nirvana leiten:
Bash:
kill `pidof rsh` 2>/dev/null
Oder man wertet eine Variable aus:
Bash:
ids=`pidof rsh`; if [ ! -z "$ids" ]; then kill $ids; fi
 

Lord_Icon

Blog Benutzer
#3
DANKE Killerbees19.

--no-run-if-empty in Kombi mit /bin/bash war DIE Lösung

Die Umleitung in den Mülleimer ist sicherlich auch hilfreich... aber mit den erweiterungen gibt es nun keine Fehler mehr.
Erweitert noch mit Sleep und der Cronjob läuft nun sekündlich. VIELEN Dank

Code:
SHELL=/bin/bash
*/1 * * * *  for ((i=0; i<=59; i++ )); do ps fax | grep rsh | grep -v grep | awk '{print $1}' | xargs --no-run-if-empty kill | sleep 1s >/dev/null 2>&1; done >/dev/null 2>&1
Das mit /bin/bash und cronjob verstehe ich allerdings noch nicht ganz.
Denn auf einen anderen Server getestet klappt es einwandfrei. Da brauch ich nicht /bin/bash mitgeben

Was ist denn default für den Cronjob? bash oder sh
Und wo finde ich diese Einstellungen denn? Ich muß ja offensichtlich irgendwann mal was eingegeben haben, was auf den anderen Server den cronjob von sh auf bash umgestellt hat:eek:
 

Lord_Icon

Blog Benutzer
#4
Asoo...

Code:
kill `pidof rsh`
kill: Gebrauch: kill [-s Signalname | -n Signalnummer | -Signalname] [pid | job] ... oder kill -l [Signalname]

kill 'pidof rsh'
-bash: kill: pidof rsh: Die Argumente müssen Prozess- oder Jobbezeichnungen sein.

kill "pidof rsh"
-bash: kill: pidof rsh: Die Argumente müssen Prozess- oder Jobbezeichnungen sein.
Aber meins geht ja jetzt :D
 

danton

Debian User
#5
Was ist denn default für den Cronjob? bash oder sh
/bin/sh ist in der Regel nur ein Link, über den man die Default-Shell festlegt. Bei Debian ist dort z.B. normalerweise dash eingetragen, andere Distris können das anders handhaben. Cron verwendet also /bin/sh, wenn man nicht so wie du eine explizite Shell vorgibt.
 

DeaD_EyE

Blog Benutzer
#7
Bash:
pkill -x rsh
Oder explizit für Python3.5+:
Python:
#!/usr/bin/env python3

"""
This programm kills all processes by given process name with SIGTERM
"""

import sys
import signal
import os
from pathlib import Path


def killall(name):
    for path in Path('/proc').glob('*'):
        if path.name.isdigit():
            try:
                comm_path = path / 'comm'
                comm = comm_path.read_text().strip()
                if name == comm:
                    pid = int(path.name)
                    print('Killing process', path.name, file=sys.stdout)
                    os.kill(pid, signal.SIGTERM)
            except (PermissionError, FileNotFoundError):
                pass
            except Exception as e:
                print('Got exception:', e, file=sys.stdout)
                return 1
    return 0


def main():
    if not sys.stdin.isatty():
        name = sys.stdin.read().strip()
    elif len(sys.argv) != 2:
        print(__doc__)
        print(sys.argv[0], 'exact_process_name')
        print('or')
        print('echo procname |', sys.argv[0])
        sys.exit(1)
    else:
        name = sys.argv[1]
    return killall(name)


if __name__ == '__main__':
    sys.exit(main())
Würde ich aber nicht verwenden, da ein in C geschriebenes Programm weniger overhead hat und ja bereits standardmäßig auf jeder Distribution vorhanden ist. Mir macht es immer wieder Spaß bekannte GNU Programme selbst zu entwickeln.
 
Last edited:

elias5000

Pricipal Systems Engineer
#9
Erweitert noch mit Sleep und der Cronjob läuft nun sekündlich. VIELEN Dank
Du killst sekündlich alle eventuell laufenden rsh-Prozesse...
Mir erschließt sich noch nicht ganz, worauf du hinaus willst. Ich habe aber das Gefühl, dass das Killen von rsh-Prozessen nicht dein eigentliches Anliegen ist.
Wenn du nicht willst, dass rsh läuft, könntest du es auch vom System entfernen.
 
Top