bash 執行會跑程序的指令 [論壇 - 新手村]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊

(1) 2 »


bash 執行會跑程序的指令
會員一級
註冊日期:
2017/3/31 11:10
所屬群組:
已註冊使用者
等級: 1
HP : 0 / 21
MP : 3 / 412
EXP: 86
離線
如題

我有個test.sh檔

內容大概如下

#!/bin/bash
IDnumber=../../R123456789
cd $IDnumber
gitbook pdf
if [ $? -eq 0 ];then echo success; else echo fail; fi
exit

第2 3行是跳到某個資料夾
第4行是一個產生PDF檔的gitbook pdf指令

第5行是判斷第4行執行完後
若成功則印出success;反之印出fail

第6行是指test.sh執行完後關閉

我問題在第4行

gitbook pdf會根據我所在資料夾
針對裡面的檔案(例如html或md檔)
進行編譯...並在當下的資料夾產生pdf檔

重點在於它編譯產製過程會有一段時間

就如同我們用apt-get安裝檔案一樣
是需要需要時間的程序

因為我用php執行echo shell_exec(test.sh)
瀏覽器會顯示得到執行結果(success或fail)

我的結果是fail
(當然..如果直接開bash執行gitbook pdf是正常可以編譯產製PDF的)

想請問..該如何解決像這種會跑一段時間的指令..讓我最終結果是success??

PS:以下是執行gitbook pdf後會出現的訊息(如附件檔案)
user@user-virtual-machine:~/test/html/gitbookwork/R123456789$ gitbook pdf
info: 7 plugins are installed
info: 6 explicitly listed
info: loading plugin "highlight"... OK
info: loading plugin "search"... OK
info: loading plugin "lunr"... OK
info: loading plugin "sharing"... OK
info: loading plugin "fontsettings"... OK
info: loading plugin "theme-default"... OK
info: found 4 pages
info: found 6 asset files
info: >> generation finished with success in 26.7s !
info: >> 1 file(s) generated
user@user-virtual-machine:~/test/html/gitbookwork/R123456789$

附件:



png  2017-04-21 15-29-55 的螢幕擷圖.png (193.96 KB)
48934_58f9b511620bf.png 1340X465 px

2017/4/21 15:19
應用擴展 工具箱
回覆: bash 執行會跑程序的指令
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30282
EXP: 23
離線
這個回覆只是初步猜測可能發生的因素,我模擬的測試結果請看下面「回覆#3」。

=========================================

我猜測您的問題是不是出在路徑

當您的「test.php」 call 「test.sh」
而您的「test.sh」 裡面的「gitbook pdf」在執行的時候,
不是原本您預期的路徑?
所以執行「gitbook pdf」的結果「$?」就是「fail」。
所以建議您可以先確認看看「cd $IDnumber」是不是真的是切換到您原本預期的路徑。

原本


#!/bin/bash
IDnumber=../../R123456789
cd $IDnumber
gitbook pdf
if [ $? -eq 0 ];then echo success; else echo fail; fi
exit



改用下面的先測看看


#!/bin/bash
IDnumber=../../R123456789
cd $IDnumber

pwd

gitbook pdf

echo $?




===============================================

另外php一般在網頁執行的時候,會限制時間,
執行時間過長的問題可以參考下面網頁,

http://php.net/manual/en/function.set-time-limit.php
http://php.net/manual/en/info.configuration.php#ini.max-execution-time

set_time_limit(0) //設定0,就不會限制執行時間

不過我不確定您的狀況是否是因為這個原因,
我還沒去使用gitbook的環境來測試,等會來測試。

我只有用下面的程式碼來測,看起來不是timeout造成的。

## test.php


<?php
        // http://php.net/manual/en/function.set-time-limit.php
        set_time_limit(0);
        // http://php.net/manual/en/function.shell-exec.php
        $output = shell_exec('./test.sh');
        echo "<pre>$output</pre>";
?>




不過下面的程式碼
並不能準確模擬您的狀況,
要接近的還原您遇到的狀況,還是需要執行「gitbook pdf」來測試。


## test.sh


#!/usr/bin/env bash

sleep 27

false
# true


if [ $? -eq 0 ]; then
        echo success
        exit 0
else
        echo fail
        exit 1
    



上面這段修改自之前另一個討論的「回覆」。

以上待釐清,等會使用gitbook來測看看。


2017/4/21 17:03
應用擴展 工具箱
回覆: bash 執行會跑程序的指令
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30282
EXP: 23
離線
# 測試報告:

我剛使用「test.php」call「test.sh」來測試,

而「test.sh」裡面也是使用「gitbook pdf」。

我測的結果是正常的,會顯示「success」。

您可能要再找看看,找看看您發生狀況的關鍵因素是什麼了?

## 測試專案資料夾


/home/user/project/shell-exec
├── book
├── test.php
└── test.sh





## test.php


<?php
        // http://php.net/manual/en/function.set-time-limit.php
        set_time_limit(0);
        // http://php.net/manual/en/function.shell-exec.php
        $output = shell_exec('./test.sh');
        echo "<pre>$output</pre>";
?>



## test.sh


#!/usr/bin/env bash

cd book

pwd

gitbook pdf

if [ $? -eq 0 ]; then
        echo success
        exit 0
else
        echo fail
        exit 1
fi





## 啟動測試的WebServer


$ php -S localhost:8080




## 觀看結果


$ firefox http://localhost:8080/test.php



從瀏覽器可以看到下面的內容


/home/user/project/shell-exec/book
info: 7 plugins are installed
info: 6 explicitly listed
info: loading plugin "highlight"... OK
info: loading plugin "search"... OK
info: loading plugin "lunr"... OK
info: loading plugin "sharing"... OK
info: loading plugin "fontsettings"... OK
info: loading plugin "theme-default"... OK
info: found 15 pages
info: found 3 asset files
info: >> generation finished with success in 18.0s !
info: >> 1 file(s) generated
success




## 用php直接執行

執行


$ php test.php



顯示


<pre>/home/user/project/shell-exec/book
info: 7 plugins are installed
info: 6 explicitly listed
info: loading plugin "highlight"... OK
info: loading plugin "search"... OK
info: loading plugin "lunr"... OK
info: loading plugin "sharing"... OK
info: loading plugin "fontsettings"... OK
info: loading plugin "theme-default"... OK
info: found 15 pages
info: found 3 asset files
info: >> generation finished with success in 17.4s !
info: >> 1 file(s) generated
success
</pre>



## 模擬路徑不正確

在「test.sh」 裡面改成「cd book2」,不存在「book2」這個資料夾。模擬cd路徑不正確。


#!/usr/bin/env bash

cd book2

pwd

gitbook pdf

if [ $? -eq 0 ]; then
        echo success
        exit 0
else
        echo fail
        exit 1
fi




執行


$ ./test.sh



顯示


./test.sh: line 3: cd: book2: No such file or directory
/home/user/project/shell-exec

FileNotFoundError: No "README" file (or is ignored)
fail





執行


$ php test.php



顯示


./test.sh: line 3: cd: book2: No such file or directory
<pre>/home/user/project/shell-exec

FileNotFoundError: No "README" file (or is ignored)
fail
</pre>



2017/4/21 17:41
應用擴展 工具箱
回覆: bash 執行會跑程序的指令
會員一級
註冊日期:
2017/3/31 11:10
所屬群組:
已註冊使用者
等級: 1
HP : 0 / 21
MP : 3 / 412
EXP: 86
離線
謝謝 samwhelp 大大的熱心回覆~

太仔細了~

我也找到問題所在了~

從你一開始說到路徑問題時~
我就想到一個關鍵問題~

我的環境有點複雜~

不知道您是否聽過docker
(如果不知道在麻煩大大自行搜尋 網上有很多文獻 因為解釋起來會解釋不完)

我的php架構(及server.sql...等)都裝在docker底下

而網站目錄有所謂的實體目錄與虛擬目錄

之前在實驗gitbook時~都是在實體測試
沒想到測試到從php跑sh時..
忘了..從php執行程式會在虛擬目錄下執行

也因此進去docker後才發現
我的docker也必須安裝gitbook才有相關指令可以執行

目前初步測試已經有gitbook指令可以操作了~

從php執行sh跑指令也都正常
(指令包刮gitbook version,gitbook init)

不過在執行gitbook pdf時還是出現問題了
如下..

EbookError: Error during ebook generation: 1% Converting input to HTML...
InputFormatPlugin: HTML Input running
on /tmp/tmp-72206AoHgIzetV6D/SUMMARY.html
Language not specified
Creator not specified
Building file list...
Normalizing filename cases
Rewriting HTML links
34% Running transforms on ebook...
Merging user specified metadata...
Detecting structure...
Detected chapter: Introduction
Detected chapter: CH1
Detected chapter: CH2
Detected chapter: Item 1
Auto generated TOC with 4 entries.
Flattening CSS and remapping font sizes...
Failed to parse CSS selector: u'h|button::-moz-focus-inner'
Failed to parse CSS selector: u'h|input::-moz-focus-inner'
Failed to parse CSS selector: u'h|input[type=search]::-webkit-search-cancel-button'
Failed to parse CSS selector: u'h|input[type=search]::-webkit-search-decoration'
Source base font size is 12.00000pt
Removing fake margins...
Cleaning up manifest...
Trimming unused files from manifest...
Creating PDF Output...
67% Running PDF Output plugin
Traceback (most recent call last):
File "/usr/bin/ebook-convert", line 20, in <module>
sys.exit(main())
File "/usr/lib/calibre/calibre/ebooks/conversion/cli.py", line 359, in main
plumber.run()
File "/usr/lib/calibre/calibre/ebooks/conversion/plumber.py", line 1189, in run
self.opts, self.log)
File "/usr/lib/calibre/calibre/ebooks/conversion/plugins/pdf_output.py", line 123, in convert
must_use_qt()
File "/usr/lib/calibre/calibre/gui2/__init__.py", line 1041, in must_use_qt
raise RuntimeError('X server required. If you are running on a'
RuntimeError: X server required. If you are running on a headless machine, use xvfb

不知道您是否知道是甚麼原因?

PS:我有執行gitbook init與gitbook serve
執行後相關的gitbook資訊或檔案(如README、_book...等)
都有出現在資料夾下
另外..我安裝gitbook的方式與執行方式都跟我在實體時的實驗一模一樣
但在虛擬時出現以上問題..

PS2..另外請問一個問題
在sh檔第1行..
#!/usr/bin/env bash

#!/bin/bash
有甚麼不一樣?

2017/4/24 10:45
應用擴展 工具箱
回覆: bash 執行會跑程序的指令
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30282
EXP: 23
離線
docker,我聽過,在網路上的文章或多或少都會看到,
只是我一直沒花時間去碰這部份的議題,
所以對docker的概念不懂,還有不曉得一些使用上的注意事項。

然而執行「gitbook pdf」需要安裝「calibre」這個「package」。

* https://github.com/GitbookIO/gitbook/blob/master/docs/ebook.md

我猜測您發生問題,應該跟這個環節有關,您可以朝這方面研究看看。

若有研究出什麼心得,還請不吝分享,(若您的時間和意願允許的話)

============================================================

另外從你給的提示訊息,就可以看到一些跟calibre相關的線索

例如,若有安裝「calibre」這個「package」的話

執行


$ dpkg -S /usr/lib/calibre/calibre/ebooks/conversion/plugins/pdf_output.py



顯示


calibre: /usr/lib/calibre/calibre/ebooks/conversion/plugins/pdf_output.py



就可以知道「/usr/lib/calibre/calibre/ebooks/conversion/plugins/pdf_output.py」這個檔案,
是屬於「calibre」這個「package」。

同理執行


$ dpkg -S /usr/bin/ebook-convert



顯示


calibre: /usr/bin/ebook-convert



也可以執行


$ dpkg -L calibre



就可以知道「calibre」這個「package」安裝那些檔案在系統上。

這些技巧可以參考「[索引] 套件操作實務」,裡面有紀錄一些討論案例和參考連結。


然後下載「gitbook」的「source code」



$ git clone https://github.com/GitbookIO/gitbook.git



然後執行


$ grep 'ebook-convert' gitbook/* -R -n



顯示



gitbook/docs/ebook.md:16:### Installing ebook-convert
gitbook/docs/ebook.md:18:`ebook-convert` is required to generate ebooks (epub, mobi, pdf).
gitbook/docs/ebook.md:36:Download the [Calibre application](https://calibre-ebook.com/download). After moving the `calibre.app` to your Applications folder create a symbolic link to the ebook-convert tool:
gitbook/docs/ebook.md:39:$ sudo ln -s ~/Applications/calibre.app/Contents/MacOS/ebook-convert /usr/bin
gitbook/packages/gitbook/src/output/ebook/onFinish.js:50: 'ebook-convert',
gitbook/packages/gitbook/src/output/ebook/onFinish.js:63: cmd: 'ebook-convert',
gitbook/packages/gitbook/src/output/ebook/options.js:8: // Format to generate using ebook-convert
gitbook/packages/gitbook/src/output/ebook/getConvertOptions.js:8: Generate options for ebook-convert





就可以找到「gitbook/packages/gitbook/src/output/ebook/onFinish.js」這個檔案,
裡面會有跟「ebook-convert」這個指令相關的片段。


$ man ebook-convert
$ ebook-convert -h


突然想起來,以前有貼過一篇「[分享] calibre 使用心得」。

============================================================

## 相關連結

* https://www.npmjs.com/package/gitbook
* https://www.npmjs.com/package/gitbook-cli

* https://github.com/GitbookIO/gitbook
* https://github.com/GitbookIO/gitbook-cli

* https://en.wikipedia.org/wiki/Shebang_(Unix)
* https://en.wikipedia.org/wiki/Env
* https://en.wikipedia.org/wiki/Shell_script
* https://en.wikipedia.org/wiki/Unix_shell


$ man ebook-convert
$ man env

============================================================


以上提供參考

報告完畢


2017/4/24 12:24
應用擴展 工具箱
回覆: bash 執行會跑程序的指令
會員一級
註冊日期:
2017/3/31 11:10
所屬群組:
已註冊使用者
等級: 1
HP : 0 / 21
MP : 3 / 412
EXP: 86
離線
這些檔案從一開始看到那些Error的訊息後
我就著手開始查了~

就如同我前面的回覆說的~
我安裝gitbook的方法跟在實體安裝時一樣~
版本還故意更新一樣的版本~

至於那個calibre..
不管實體部份或虛擬部份我都有裝~

總而言之...
目前狀況是...
除了實體路徑與虛擬路徑的差別外~
根這次實驗有關的東西(環境)都是一樣的~

實體部份我甚至不用gitbook serve就可以執行gitbook pdf
虛擬部份我就算執行gitbook serve還是一樣的錯誤訊息...= =

PS..
程式部份都檢查過..
與在實體路徑下實驗時都無異~

-----------------------------------------------------
我注意到您分享的那篇calibre的文章

我會使用gitbook pdf是因為它有個索引(SUMMARY)可以編輯細部章節

並且只要下一次指令就可以把內部的相關章節檔案通通整理成一本書(PDF)

而calibre如果只是純粹使用ebook-convert的話
如果想與上述指令有同等功能的話~
必須先自己想辦法邊出或組合一份檔案
這份檔案會有準備轉成PDF的相關資訊(如索引.檔案...等)

這對我目前的作業來講又會多一層工...= =

所以才會有您之前提到的onFinish.js那段ebook-convert程式碼
他就是在處理這件事~

使你一個指令就解決整合問題~
這是我目前對這兩個指令的理解~

有錯的話~歡迎指教~^^

2017/4/24 13:22
應用擴展 工具箱
回覆: bash 執行會跑程序的指令
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30282
EXP: 23
離線
A-Wei 寫到:
File "/usr/lib/calibre/calibre/ebooks/conversion/plugins/pdf_output.py", line 123, in convert
must_use_qt()
File "/usr/lib/calibre/calibre/gui2/__init__.py", line 1041, in must_use_qt
raise RuntimeError('X server required. If you are running on a'
RuntimeError: X server required. If you are running on a headless machine, use xvfb




在「docker」的環境,會不會跟上面紅色提到的有關?

因為不懂「docker」的限制,
和「calibre」內部的實做,還沒花時間去深究,
所以我只能胡亂猜測,提供是否有可能的線索,歹勢拉。

執行


$ grep must_use_qt /usr/lib/calibre/calibre/gui2/__init__.py -A 5



可以看到一些「文字說明」,我也還不懂,不過可以參考看看。

=================================================


關於

A-Wei 寫到:
實體部份我甚至不用gitbook serve就可以執行gitbook pdf
虛擬部份我就算執行gitbook serve還是一樣的錯誤訊息...= =




執行「gitbook pdf」不需要先執行「gitbook serve」。

我上面「回覆#3」在測試「gitbook pdf」的時候,也沒有先執行「gitbook serve」。

我所觀察到的,執行「gitbook serve」,
只是讓您可以在「Browser」觀看生成的網頁,
若您有修改原始markdown檔案,會即時反應生成網頁,如此而已。

2017/4/24 13:31
應用擴展 工具箱
回覆: bash 執行會跑程序的指令
會員一級
註冊日期:
2017/3/31 11:10
所屬群組:
已註冊使用者
等級: 1
HP : 0 / 21
MP : 3 / 412
EXP: 86
離線
我也有在猜您標記的紅字是否與docker有關~
但..理論上應該沒有~
因為就目前研究結果~
docker只是一個容器~
內部server的執行應該跟docker是分開的兩個個體~
可以想像docker是一台電腦~
裡面可以放無數個伺服器~
例如Apache、IIS、SQL Server..等..
每個伺服器都可以獨立運作不會互相干擾~

另外..Error最後一段有寫到.."use xvfb"
不知道xvfb是甚麼..
查了一下也看不太懂= =
還在研究~= =

回到正題~

我前面的回覆有補充~

怕您沒注意到~

再貼一次~

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

我注意到您分享的那篇calibre的文章

我會使用gitbook pdf是因為它有個索引(SUMMARY)可以編輯細部章節

並且只要下一次指令就可以把內部的相關章節檔案通通整理成一本書(PDF)

而calibre如果只是純粹使用ebook-convert的話
如果想與上述指令有同等功能的話~
必須先自己想辦法邊出或組合一份檔案
這份檔案會有準備轉成PDF的相關資訊(如索引.檔案...等)

這對我目前的作業來講又會多一層工...= =

所以才會有您之前提到的onFinish.js那段ebook-convert程式碼
他就是在處理這件事~

使你一個指令就解決整合問題~
這是我目前對這兩個指令的理解~

有錯的話~歡迎指教~^^

2017/4/24 13:48
應用擴展 工具箱
回覆: bash 執行會跑程序的指令
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30282
EXP: 23
離線
您補充的回覆,我有看到,
您後來補充的,應該是跟目前遇到的狀況無關,
上面我也有些補充。

不過我也不曉得您目前在docker會遇到這個狀況,關鍵的環節是出在那,

我個人若遇到這個狀況,也只能去追程式碼,
然後用土法煉鋼的方式測試,我通常是這樣找出關鍵的環節,或是找到解法的。

因為我目前沒多餘的心力去學習docker並且還原您的環境,重現您遇到的狀況,

所以目前只能引導您去看程式碼,歹勢拉!

再不然就要等待是否有人遇到同樣的狀況,可以來回覆您了!

或是查詢「docker calibre gitbook」,「docker calibre」,「docker qt」或是其他的關鍵字,
看看能不能找到相關的文章,也許有人會遇到相同的狀況。



2017/4/24 14:00
應用擴展 工具箱
回覆: bash 執行會跑程序的指令
會員一級
註冊日期:
2017/3/31 11:10
所屬群組:
已註冊使用者
等級: 1
HP : 0 / 21
MP : 3 / 412
EXP: 86
離線
我從這段話
"raise RuntimeError('X server required. If you are running on a'
RuntimeError: X server required. If you are running on a headless machine, use xvfb"
下去著手查詢..

然後查到..
xvfb是一種圖形化介面的東西
用來模擬視窗化的功能..

我回過頭來回想實體與虛擬的差別

也正是沒有圖形化介面這種功能

實體路徑部份有介面可以讓我操作
但虛擬路徑的沒有(純打指令的地方)

想請問您...
一開始您測試成功..的環境...
也是有圖形介面的Linux環境嗎?
例如Ubuntu..(我是Ubuntu)

2017/4/24 14:28
應用擴展 工具箱

(1) 2 »

 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.