(originally published on 17.02.2011, reviewed/rewritten on 03.04.2025, tested on Oracle Solaris 11.4 SRU 80)
 

Many people are aware of the fact, that you kann kill a process. But you can suspend a running process in order to resume the execution later.

root@testbed:~# cat stopstart.pl 
#!/usr/bin/perl
while () {
 $zeit=time();
 print "... $zeit \n";
 sleep(2);
}

The script just prints out unixtime every 2 seconds.

root@testbed:~# ./stopstart.pl  
... 1746250121 
... 1746250123 
... 1746250125 
... 1746250146 
... 1746250148 
... 1746250150 

You surely have noticed, that there are missing timestamps between 1746250125 and 1746250146. What happened between those timestamps? In another shell i stopped the process.

root@testbed:~# ps -ef | grep "stopstart"
    root  5140  5092   0 07:28:26 pts/1       0:00 /usr/bin/perl ./stopstart.pl
root@testbed:~# pstop 5140

When you look at the flags of the process, you will see the flags indicating, that the process has stopped:

5140:   /usr/bin/perl ./stopstart.pl
        data model = _LP64  flags = MSACCT|MSFORK
 /1:    flags = STOPPED|ISTOP|ASLEEP  nanosleep(0x7fc3a2c94760,0x7fc3a2c94770)
        why = PR_REQUESTED

After waiting for a moment, i resumed the process. The perl script continued to print out the timestamps and the flags indicating a stopped process disappeared.

root@testbed:~# prun 5140
root@testbed:~# pflags 5140
5140:   /usr/bin/perl ./stopstart.pl
        data model = _LP64  flags = MSACCT|MSFORK
 /1:    flags = ASLEEP  nanosleep(0x7fc3a2c94760,0x7fc3a2c94770)
Written by

Joerg Moellenkamp

Grey-haired, sometimes grey-bearded Windows dismissing Unix guy.