Getting pid of a particular instance of the application in unix - unix

I have one application and multiple instances of the same application are running in the system. Every instance of the application is invoked with different argument.
I want to get the pid of a particular process which had been invoked with some argument i.e. pid of particular instance of the application according to the argument passed.
Is there any way to get it?

I would probably check output of ps -eo pid,args and grep for the parameters I need and then cut the pid from the beginning of the output:
ps -eo pid,args | grep --parameter=x | cut -c 1-5
Check man page of grep. There are a lot of (somewhat confusing) options that will allow you shape the output of the command. In the above example -e selects all the processes to be shown and -o lets user to choose what to output.

Related

Using grep and wc to search and count matching processes

I am using ps to list all of the processes running on the machine I am connected to, searching them for my own processes, and then printing the number of processes I am running, like so:
ps -Af | grep '^mkuhlman' | wc -l
Problem is, checking against the actual list of processes, I'm only running 8, but wc is listing 9 processes. What am I doing wrong?
To clarify, I am not looking for matches to processes, but matches to my own username.
Your pipeline has a few processes, and you're counting them.
Running ps is fine, but you might be happier with pgrep. It has a man page. (And ps -A seems at odds with grepping for your own username.)
Though grep -v grep would work in most cases, it can result in wrong output as it excludes all grep processes, not just the ones related to the ps command line. So, you could do this instead:
ps -Af | grep -E '^mkuhlman|__unique__' | grep -v __unique__
where __unique__ is a unique string that is unlikely to be used in the command line of other user processes.
See also:
Finding process count in Linux via command line

trigger a zsh function based on string match of any command's stdout/stderr?

This is surprisingly hard to search for.
The only thing I can find, are TRAP* functions, which can be triggered via various signals.
But I really want to watch all stdout/stderr, and have a function trigger if a certain string is matched.
(example: refreshing kerberos credentials. A command fails and emits a standard error message indicating I need to authenticate. I want to automatically run the command to do so ;)
The shell doesn't see a command's stdout/stderr if not piped to the shell. So, you need to redirect stdout/stderr to your zsh function. But you can also send them to both your zsh function and somewhere else. For instance:
your_command 2>&1 | tee >(your_zsh_function)
or
your_command |& tee >(your_zsh_function)
or
your_command >>(your_zsh_function) >>/dev/tty 2>&1
your_zsh_function will grep its input for a string match. A drawback is that you may have buffering problems.
But concerning your example, if I understand correctly, you may want to use the expect utility: "programmed dialogue with interactive programs".

Killing the process with the lowest PID in Unix

I have 2 processes with the same name, but different PIDs. I need to find out the process with the lowest PID among these 2 and kill it. How do i do that?
A bit contrived, but this does the trick (using bash as an example):
pidof bash | grep -o "[0-9]*" | sort -n | sed '1q'
or
pidof bash | tr -s " " "\n" | sort -n | sed '1q'
keep in mind that the "lowest PID" doesn't really mean anything with regard to startup order unless you haven't had enough processes to wrap around from the max down to the low unused numbers again. A better (and probably more-complex) way of doing this would be to kill either the older process or the newer process, depending on which one is bad.
You can find some inspiration here How do you kill all Linux processes that are older than a certain age?
Unix, or a *nix with a /proc directory?
If you have /proc support, parse through /proc/[0-9]+/cmdline to look for the processes whose command matches what you're looking for; the directory name (after /proc) is the id.
opendir() and readdir() will be your tools to parse through the directory.
If you don't have /proc support, you can popen("ps -options here", "r"); to read the output of ps (with whatever options are appropriate for your system) to parse through the process list.

List and kill at jobs on UNIX

I have created a job with the at command on Solaris 10.
It's working now but I want to kill it but I don't know how I can find the job number and how to kill that job or process.
You should be able to find your command with a ps variant like:
ps -ef
ps -fubob # if your job's user ID is bob.
Then, once located, it should be a simple matter to use kill to kill the process (permissions permitting).
If you're talking about getting rid of jobs in the at queue (that aren't running yet), you can use atq to list them and atrm to get rid of them.
To delete a job which has not yet run, you need the atrm command. You can use atq command to get its number in the at list.
To kill a job which has already started to run, you'll need to grep for it using:
ps -eaf | grep <command name>
and then use kill to stop it.
A quicker way to do this on most systems is:
pkill <command name>
at -l to list jobs, which gives return like this:
age2%> at -l
11 2014-10-21 10:11 a hoppent
10 2014-10-19 13:28 a hoppent
atrm 10 kills job 10
Or so my sysadmin told me, and it
First
ps -ef
to list all processes. Note the the process number of the one you want to kill. Then
kill 1234
were you replace 1234 with the process number that you want.
Alternatively, if you are absolutely certain that there is only one process with a particular name, or you want to kill multiple processes which share the same name
killall processname

killall on process of same name

I would like to use killall on a process of the same name from which killall will be executed without killing the process spawning the killall.
So in more detail, say I have process foo, and process foo is running. I want to be able to run "foo -k", and have the new foo kill the old foo, without killing itself.
pgrep foo | grep -v $$ | xargs kill
If you don't have pgrep, you'll have to come up with some other way of generating the list of PIDs of interest. Some options are:
Use ps with appropriate options, followed by some combination of grep, sed and/or awk to match the processes and extract the PIDs.
killall can send a signal 0 instead of SIGTERM; the standard semantics of this is that it doesn't send a signal, but just determines if the process is alive or not. Perhaps you can use killall to select the process list and get it to print the PIDs of the matching ones that are alive. This would also probably require a bit of post-processing with sed.
There may be something along the lines of Linux's /proc filesystem with pseudo-files holding system data that you could grovel through. Again, grep/awk/sed are your friends here.
If you truly need particular details on how to do this, comment or send me mail, and I'll try expanding some of these options in more detail.
[Edits: added further options for those without pgrep.]
This seems to work on OS X:
killall -s foo | perl -ne 'system $_ unless /\b'$PPID'\b/'
killall -s lists what it would do, one PID at a time. Do what it would do except for killing yourself.
The usual way to solve this is to have foo write its process ID to a file, say something like /var/run/foo.pid when it is run in daemon mode. Then you can have the non-daemon version read the PID from the PID file and call kill(2) on it directly. This is usually how apache and the like handle it. Of course the newer OSX daemons go through launchd(8) instead, but there are still a few that use good old fashioned signals.

Resources