问题描述:

I'm trying to test a Bash script which copies files individually and does some stuff to each file. It is meant to be resumable, so I'd like to make sure to test this properly. What is an elegant solution to kill or otherwise abort the script which does the copying from the test script, making sure it does not have time to copy and process all the files?

I have the PID of the child process, I can change the source code of both scripts, and I can create arbitrarily large files to test on.

Clarification: I start the script in the background with &, get the PID as $!, then I have a loop which checks that there is at least one file in the target directory (the test script copies three files). At that point I run kill -9 $PID, but the process is not interrupted - The files are copied successfully. This happens even if the files are big enough that creating them (with dd and /dev/urandom) takes a couple seconds.

Could it be that the files are only visible to the shell when cp has finished? It would be a bit strange, but it would explain why the kill command is too late.

Also, the idea is not to test resuming the same process, but cutting off the first process (simulate a system crash) and resuming with another invocation.

网友答案:

Send a KILL signal to the child process:

kill -KILL $childpid
网友答案:

You can try an play the timing game by using large files and sleeps. You may have an issue with the repeatability of the test.

You can add throttling code to the script your testing and then just throttle it all the way down. You can do throttling code by passing in a value which is:

  • a sleep value for sleeping in the loop
  • the number of files to process
  • the number of seconds after which the script will die
  • a nice value to execute the script at

Some of these may work better or worse from a testing point of view. nice'ing may get you variable results, as will setting up a background process to kill your script after N seconds. You can also try more than one of these at the same time which may give you the control you want. For example, accepting both a sleep value and the kill seconds could give you fine grained throttling control.

相关阅读:
Top