kill コマンドを使用して、cakePHP で実行中のジョブを強制終了できません。ジョブ コントローラーのインデックス ビューのテーブルにプロセスのリストが表示され、実行中の各プロセスのリンクをクリックして強制終了できます。
私はこのようなものを持っています:
//myApp/app/Views/Jobs/index.php:
<?php
echo $this->Form->create('Job', array('action' => 'actOnJob', 'onsubmit' => 'return confirm("are you sure?");'));
echo "<table>\n";
/* irrelevant code excluded */
$nonOrphanPids = array();
foreach ($jobs as $job) {
/* irrelevant code excluded */
if ($job['Job']['is_running'] == 1 && $job['Job']['pid'] != null) {
echo " <td>";
//KEY PART OF CODE FOR THIS QUESTION, this is a link that attempts to abort the job selected
echo $this->Html->link('Abort Job', array('action' => 'actOnJob', $id, 'abort'), array('confirm' => __('Are you sure?')));
echo "</td>";
echo " <td>";
echo $this->Form->input('',
array(
'type' => 'checkbox',
'name' => "cbAbort$id",
'id' => "cbAbort$id",
'default' => isset($_REQUEST["cbAbort$id"]) ? $_REQUEST["cbAbort$id"] : 0
)
);
} else {
echo " <td colspan='2'>";
}
echo " </td>";
/* irrelevant code excluded */
}
foreach ($orphanJobsDetails as $ophanJobDetails) {
if (!in_array($ophanJobDetails['PID'], $nonOrphanPids) &&
strpos($ophanJobDetails['COMMAND'], 'grep insertVehicleData.py') === false)
{
/* irrelevant code excluded */
//KEY PART OF CODE FOR THIS QUESTION, this is a link that attempts to abort the job selected
echo $this->Html->link('Abort Job', array('action' => 'actOnJob', $id, 'abort'), array('confirm' => __('Are you sure?')));
echo " <td>";
echo $this->Form->input(
'', array(
'type' => 'checkbox',
'name' => "cbAbort$id",
'id' => "cbAbort$id",
'default' => isset($_REQUEST["cbAbort$id"]) ? $_REQUEST["cbAbort$id"] : 0
)
);
echo " </td>";
/* irrelevant code excluded */
}
}
echo "</table>\n";
echo "</div>\n";
?>
次に、myApp/app/Controller/JobsController.php で:
class JobsController extends AppController {
public function actOnJob($id = 0, $action = '') {
$this->autoRender = false;
/*irrelevant code excluded*/
else if ($action == 'abort') {
$this->abort($id);
}
/*irrelevant code excluded*/
$this->redirect(env('HTTP_REFERER'));
}
public function abort($id) {
if (strpos($id, '_') === false) {
$job = $this->Job->find('first', array('conditions' => array('id' => $id))); //, 'fields' => array('pid', 'is_running')));
if ($job['Job']['is_running'] == 1) {
$cmd = env('DOCUMENT_ROOT') . '/app/killprocess.sh ' . $job['Job']['pid'];
//originally tried the following 2 lines, one a time, before trying `shell_exec($cmd)`;
//posix_kill($job['Job']['pid'], 9);
//posix_kill($job['Job']['pid'], 15);
shell_exec($cmd);
$this->Job->id = $id;
$this->Job->save(array('Job' => array('is_running' => 0, 'pid' => null)));
$this->loadModel('JobRunnings');
$this->JobRunnings->save(array('JobRunnings' => array('is_running' => 0, 'id' => 1)));
}
} else {
$pid = intval(substr($id, 1));
$cmd = env('DOCUMENT_ROOT') . '/app/killprocess.sh ' . $pid;
$this->Session->setFlash($cmd);
shell_exec($cmd);
}
}
次に、myApp/app/killProcess.sh に次のものがあります。
kill -15 $1
しかし、クリックしてジョブを強制終了しても、停止しません。コマンドラインからコマンドを手動で実行すると、強制終了されます。私が読んだことから、コードを変更しようとしたことに基づいて、sudo権限がないことに関係があると思います
myApp/app/killProcess.sh へ:
sudo kill -15 $1
そして、再試行しますが、それも機能しません。
これを機能させるにはどうすればよいですか?どんな助けでも大歓迎です。