0

I have a Linux computer that I remotely SSH into using plink on a Windows XP machine. I have a Plink program set to execute commands in a script using automated login:

plink -ssh [domain name] -l [username] -pw [password] -m commands.txt >> Outputtext.txt

commands.txt only contains the following

echo "Killing process"
ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1` | xargs kill -9
sleep 2
echo "Restarting process"
processd &

echo "Exiting..."

This script simply searches for a processname kills it then restarts it. It works everytime if the process is actually started on linux before I execute the script. However, if the process is NOT started it will actually kill the controlling terminal and exit plink.exe right on the ps -ef command.

I've narrowed it down to when I'm doing the ps -ef | grep 'processname' it will return two PID's one is the process I'm searching for, and the other is the grep processname PID itself

When the process isn't started it will only return one PID the grep 'processname' and I think kill -9 is killing that and somehow killing plink connection or the controlling terminal? Is there any way around this?

or to check if the grep 'processname' returns 2 lines meaning the process started, or if there is only 1 line then don't kill it.

Not sure if I can echo "#!bash" a bash script out and then have the bash script execute?

Or is this a weird bug in plink?

AReddy
  • 3,172
  • 5
  • 36
  • 76
zacharoni16
  • 131
  • 1
  • 6
  • 2
    If possible, I'd recommend using pkill instead of the ps|grep|... pipeline you're using now. pkill is immune to the problem you noted, whereby grep on the process list finds the grep process itself. (There are tricks to avoid that, but pkill is cleaner, IMO.) – Steven Monday May 18 '13 at 01:50
  • what about pgrep -f /path/of/programm – Rahul Patil May 18 '13 at 01:54
  • yes, also you can use killall -9 programmname or pkill as Steven suggested. – Rahul Patil May 18 '13 at 02:01

2 Answers2

1

Your command line seems really weird to me:

ps -ef | grep 'processname' | awk ‘{print $2}’ | head -n 1 | xargs kill -9
  1. You feed awk (i.e. a program which can perfectly filter its input, the much mightier program) with the output of grep.
  2. You pipe the output of awk (i.e. a program which can perfectly filter its output) into head.
  3. You use xargs for definitely just one argument.

So independently of better approaches (and this question being a duplicate) I feel obliged to correct this:

kill -9 $(ps -ef | awk '/processname/ {print $2;exit;}')
Hauke Laging
  • 90,279
  • Good catch, even though if we're strict, piping ps -ef to grep is in fact redundant considering that ps provides the -C option just for this purpose. (see also Ignacio's answer) – syntaxerror Oct 25 '14 at 03:23
0

Restrict ps to only find the command and output the info you care about.

ps -C processname -o pid

You may want to check the result code of the command before trying to actually kill anything though.

  • Oh thank you! I have another (related) question. I dont have disown or nohup installed on this linux machine, and the process I start through the plink script is bound to the plink (terminal). Is there anyway to start the process from the plink session so that the output could be available to any connecting terminal?

    Because if the plink session ends, the output from the started process doesn't display on another terminal for some reason only the original terminal that started the process

    – zacharoni16 May 18 '13 at 01:58
  • Run the command in a detached screen. – Ignacio Vazquez-Abrams May 18 '13 at 01:59
  • not sure I understand? – zacharoni16 May 18 '13 at 01:59
  • http://en.wikipedia.org/wiki/GNU_Screen – Ignacio Vazquez-Abrams May 18 '13 at 02:00
  • ah sh: Command not found? wow this linux box doesn't have anything installed nohup, screen, disown, its an openlinux embedded system – zacharoni16 May 18 '13 at 02:04