Home Php C# Sql C C++ Javascript Python Java Go Android Git Linux Asp.net Django .net Node.js Ios Xcode Cocoa Iphone Mysql Tomcat Mongodb Bash Objective-c Scala Visual-studio Apache Elasticsearch Jar Eclipse Jquery Ruby-on-rails Ruby Rubygems Android-studio Spring Lua Sqlite Emacs Ubuntu Perl Docker Swift Amazon-web-services Svn Html Ajax Xml Java-ee Maven Intellij-idea Rvm Macos Unix Css Ipad Postgresql Css3 Json Windows-server Vue.js Typescript Oracle Hibernate Internet-explorer Github Tensorflow Laravel Symfony Redis Html5 Google-app-engine Nginx Firefox Sqlalchemy Lucene Erlang Flask Vim Solr Webview Facebook Zend-framework Virtualenv Nosql Ide Twitter Safari Flutter Bundle Phonegap Centos Sphinx Actionscript Tornado Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 26

0
votes
answers
90 views
+10

端口9999服務器不接受請求

0

我想在亞馬遜EC2實例上部署我的套接字[phpws庫]。爲此,我部署了代碼並運行套接字。我選擇了端口9999進行套接字握手,但它不起作用。 我試圖捕獲請求該服務器上通過命令:端口9999服務器不接受請求

sudo tcpdump -i any port 9999 

然後我打這個端口,我沒有收到任何請求。我認爲這是因爲iptables。所以我通過命令檢查它:

sudo iptables -L 

但它清楚地顯示允許所有請求。這裏是輸出:

鏈INPUT(策略ACCEPT) 目標PROT選擇源目的地

鏈FORWARD(策略ACCEPT) 目標PROT選擇源目的地

鏈OUTPUT(策略ACCEPT) 目標保護人選擇來源目的地

在這一點上,我很無能如何前進。任何幫助都是溫和的。尋找答案。

+0

Stack Overflow是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。 – jww

沙发
0
1

您還必須在附加到EC2實例的AWS安全組中打開端口9999

+0

是的,自從過去幾個小時以來,我一直在與這個愚蠢的錯誤作鬥爭。非常感謝您的幫助。 – Pradeep

0
votes
answers
87 views
+10

如何創建一個簡單的驅動程序? [Ubuntu]

-2

這個想法是創建一個可以通過設備進行通信的驅動程序和用戶應用程序。如何創建一個簡單的驅動程序? [Ubuntu]

當我編譯模塊時,將它附加到內核並創建設備,我沒有得到任何錯誤,但是當我啓動用戶應用程序時,它崩潰了。另外,在崩潰之後,我的電腦變慢了,有時甚至需要重啓我的系統。 我也讀過內核日誌文件,發現這個錯誤:[ 336.741386] BUG: unable to handle kernel NULL pointer dereference at (null)

你能告訴我,如果我的代碼有問題嗎?

驅動程序代碼:

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/fs.h>   // Allows to open/read/write/execute a device 
#include <linux/cdev.h>   // Char driver; makes cdev available 
#include <linux/semaphore.h> // Used to access semaphores; used for synchronization for avoiding crashes 
#include <asm/uaccess.h>  // Copy_to_user;copy_from_user 

struct fake_device{ 
    char data[100]; 
    struct semaphore sem; 
}virtual_device; 

struct cdev *mcdev;  // My Char device driver 
int major_number; 
int ret; 

dev_t dev_num; 

#define DEVICE_NAME "looperdevice" 

int device_open(struct inode *inode, struct file *filp){ 
    if(down_interruptible(&virtual_device.sem) != 0){ 
     printk(KERN_ALERT "looperdevice: could not lock device during open"); 
     return -1; 
    } 
    printk(KERN_INFO "looperdevice: opened device"); 
    return 0; 

} 
ssize_t device_read(struct file* filp, char* bufStoreData, size_t bufCount, loff_t* curOffset){ 
    printk(KERN_INFO "looperdevice: Reading from device"); 
    ret = copy_to_user(bufStoreData, virtual_device.data, bufCount); 
    return ret; 
} 

ssize_t device_write(struct file* filp, const char* bufSourceData, size_t bufCount, loff_t* curOffset){ 
    printk(KERN_INFO "looperdevice: Writing to device"); 
    ret = copy_from_user(virtual_device.data, bufSourceData, bufCount); 
    return ret; 
} 

int device_close(struct inode *inode, struct file *filp){ 
    printk(KERN_INFO "looperdevice: Closing device"); 
    up(&virtual_device.sem); // Set semaphore up 
    return 0; 
} 


struct file_operations fops = { 
    .owner = THIS_MODULE, 
    .open = device_open, 
    .release = device_close, 
    .write = device_write, 
    .read = device_read 
}; 

static int driver_entry(void){ 
    /* 
    Register our device in the system 
    alloc_chrdev_region(dev_t*, uint fminor, uint count, char* name) 
    */ 
    ret = alloc_chrdev_region(&dev_num, 0, 1, DEVICE_NAME); // Will store minor and max number into dev_num, for future extraction 
    if (ret < 0){ 
     printk(KERN_ALERT "looperdevice: failed to allocate a major number"); 
     return ret; 
    } 
    // Extracting major number 
    major_number = MAJOR(dev_num); 
    printk(KERN_INFO "looperdevice: major_number extracted, %d", major_number); 
    printk(KERN_INFO "	use "mknod /dev/%s c %d 0" for device file",DEVICE_NAME, major_number); 

    mcdev = cdev_alloc(); // Create our cdev structure already initializated 
    mcdev->ops = &fops;  // struct file operations 
    mcdev->owner = THIS_MODULE; 
    // Now that we created the cdev we have to add it to the kernel 
    // int cdev_add(struct cdev* dev, dev_t num, unsigned int count) 
    ret = cdev_add(mcdev, dev_num, 1); 
    if (ret < 0){ 
     printk(KERN_ALERT "looperdevice: unable to add cdev to kernel"); 
     return ret; 

    } 
    // Initialize our semaphore 
    sema_init(&virtual_device.sem, 1); 

    return 0; 
} 
static void driver_exit(void){ 
    cdev_del(mcdev); 
    unregister_chrdev_region(dev_num,1); 
    printk(KERN_ALERT "looperdevice: Unloaded module"); 

} 

module_init(driver_entry); 
module_exit(driver_exit); 

用戶應用代碼:

#include <stdio.h> 
#include <stdlib.h> 
#include <fcntl.h> 

#define DEVICE "/dev/looperdevice" 

int main(){ 
    int i, fd, ch; 
    char write_buf[100], read_buf[100]; 
    fd = open(DEVICE, O_RDWR); 
    if (fd == -1){ 
     printf("file %s either does not exist or has been locked by another process
", DEVICE); 
     exit(-1); 
    } 
    printf("Looper application v0.1 Beta
"); 
    while (ch != 3){ 
     printf("--------------MENU-------------
"); 
     printf("1. Read from device
2. Write to device
3. Exit"); 
     printf("Choose an option: "); 
     scanf("%d", &ch); 
     switch(ch){ 
      case 1: 
       // reading from device 
       read(fd, read_buf, sizeof(read_buf)); 
       printf("DEVICE: %s
", read_buf); 
       break; 
      case 2: 
       // Writing to device 
       printf("Enter Data: "); 
       gets(write_buf); 
       write(fd, write_buf, sizeof(write_buf)); 
       break; 
      case 3: 
       exit(0); 
       break; 
      default: 
       printf("Invalid option
"); 
       break; 
     } 
    } 
    return 0; 
} 

內核日誌文件:

[ 321.242532] driver: module license 'unspecified' taints kernel. 
[ 321.242534] Disabling lock debugging due to kernel taint 
[ 321.243024] looperdevice: major_number extracted, 241 
[ 321.243026] use "mknod /dev/looperdevice c 241 0" for device file 
[ 321.243028] looperdevice: unable to add cdev to kernel 
[ 336.741386] BUG: unable to handle kernel NULL pointer dereference at           (null) 
[ 336.741524] IP: __down_interruptible+0x51/0xf0 
[ 336.741563] PGD a3279067 
[ 336.741564] PUD a3278067 
[ 336.741589] PMD 0 

[ 336.741650] Oops: 0002 [#1] SMP 
[ 336.741680] Modules linked in: driver(POE) ccm bnep pci_stub vboxpci(OE) vboxnetadp(OE) vboxnetflt(OE) vboxdrv(OE) dm_crypt dell_wmi sparse_keymap uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_v4l2 videobuf2_core videodev media dell_laptop dell_smbios btusb dcdbas btrtl btbcm btintel dell_smm_hwmon bluetooth arc4 iwldvm mac80211 intel_rapl x86_pkg_temp_thermal intel_powerclamp snd_hda_codec_hdmi coretemp kvm_intel kvm irqbypass crct10dif_pclmul crc32_pclmul ghash_clmulni_intel pcbc snd_hda_codec_idt snd_hda_codec_generic aesni_intel aes_x86_64 crypto_simd glue_helper cryptd intel_cstate intel_rapl_perf snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep snd_pcm input_leds snd_seq_midi joydev snd_seq_midi_event serio_raw snd_rawmidi snd_seq binfmt_misc iwlwifi snd_seq_device snd_timer cfg80211 
[ 336.742291] lpc_ich shpchp snd mei_me soundcore mei wmi dell_smo8800 mac_hid dell_rbtn parport_pc ppdev lp parport autofs4 hid_generic usbhid hid i915 ahci libahci psmouse i2c_algo_bit drm_kms_helper sdhci_pci sdhci syscopyarea sysfillrect e1000e sysimgblt fb_sys_fops drm ptp pps_core fjes video 
[ 336.742530] CPU: 2 PID: 3578 Comm: app Tainted: P   OE 4.10.0-37-generiC#41~16.04.1-Ubuntu 
[ 336.742607] Hardware name: Dell Inc. Latitude E5430 vPro/0NVFXC, BIOS A16 08/19/2015 
[ 336.742673] task: ffff96ace1e08000 task.stack: ffffb4d500b68000 
[ 336.742727] RIP: 0010:__down_interruptible+0x51/0xf0 
[ 336.742771] RSP: 0018:ffffb4d500b6bba0 EFLAGS: 00010046 
[ 336.742817] RAX: 0000000000000000 RBX: ffffffffc0be84c8 RCX: 0000000000000002 
[ 336.742878] RDX: ffffffffc0be84d0 RSI: 0000000000000292 RDI: ffffffffc0be84c8 
[ 336.742938] RBP: ffffb4d500b6bbe8 R08: 0000000000000000 R09: 0000000000000000 
[ 336.742998] R10: 00000000000000f1 R11: ffff96acaa4d6338 R12: 7fffffffffffffff 
[ 336.743058] R13: ffff96ace1e08000 R14: ffff96ace294eb00 R15: ffffffffaf9c5c80 
[ 336.743120] FS: 00007fadeade0700(0000) GS:ffff96ad5e300000(0000) knlGS:0000000000000000 
[ 336.743188] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 
[ 336.743237] CR2: 0000000000000000 CR3: 00000000a337a000 CR4: 00000000001406e0 
[ 336.743298] Call Trace: 
[ 336.743329] ? exact_lock+0x11/0x20 
[ 336.743363] down_interruptible+0x4b/0x60 
[ 336.743403] device_open+0x15/0x30 [driver] 
[ 336.743442] chrdev_open+0xbf/0x1b0 
[ 336.743477] do_dentry_open+0x208/0x310 
[ 336.743514] ? cdev_put+0x30/0x30 
[ 336.743548] vfs_open+0x4c/0x70 
[ 336.743581] ? may_open+0x9b/0x100 
[ 336.743620] path_openat+0x2ac/0x1430 
[ 336.743660] ? page_add_file_rmap+0x58/0x140 
[ 336.743702] do_filp_open+0x91/0x100 
[ 336.743738] ? __alloc_fd+0x46/0x170 
[ 336.743774] do_sys_open+0x12d/0x280 
[ 336.743809] SyS_open+0x1e/0x20 
[ 336.743841] entry_SYSCALL_64_fastpath+0x1e/0xad 
[ 336.743883] RIP: 0033:0x7fadea912010 
[ 336.743916] RSP: 002b:00007ffcf9ce3238 EFLAGS: 00000246 ORIG_RAX: 0000000000000002 
[ 336.743982] RAX: ffffffffffffffda RBX: 0000000000000000 RCX: 00007fadea912010 
[ 336.744042] RDX: 00007ffcf9ce3428 RSI: 0000000000000002 RDI: 00000000004009b8 
[ 336.746348] RBP: 00007ffcf9ce3330 R08: 00000000004009a0 R09: 00007fadeabf5ab0 
[ 336.748583] R10: 000000000000069d R11: 0000000000000246 R12: 00000000004006b0 
[ 336.750831] R13: 00007ffcf9ce3410 R14: 0000000000000000 R15: 0000000000000000 
[ 336.753533] Code: 00 00 48 83 e4 f0 48 83 ec 30 65 48 8b 04 25 28 00 00 00 48 89 44 24 28 31 c0 48 8b 47 10 48 89 14 24 48 89 67 10 48 89 44 24 08 <48> 89 20 4c 89 6c 24 10 c6 44 24 18 00 eb 38 4d 85 e4 7e 52 49 
[ 336.758651] RIP: __down_interruptible+0x51/0xf0 RSP: ffffb4d500b6bba0 
[ 336.761183] CR2: 0000000000000000 
[ 336.775501] ---[ end trace 3fcbe3000944b329 ]--- 

我希望你能幫助我:)

+1

'當我編譯模塊,將其連接到內核和創建設備,我沒有得到任何error' - 根據日誌,你**將模塊加載到內核時出現錯誤**:'looperdevice:無法將cdev添加到內核'。根據驅動程序的代碼,模塊的加載應該被取消(因爲返回負值),所以進一步的「BUG」看起來可疑。 – Tsyvarev

沙发
0
0

解決方案是添加模塊蝨子NSE:

MODULE_LICENSE("GPL"); 

謝謝:)

0
votes
answers
54 views
+10

配置模塊爲115kbps,然後系統將端口重置爲9600波特

0

我正在研究一個在Linux環境下編程HM-TRP無線電模塊的C程序,因爲後來我將編程約40個這樣的模塊,我想要一直輸入單個編程代碼來編程每一個編程代碼。配置模塊爲115kbps,然後系統將端口重置爲9600波特

在我的機器上我有三個終端窗口設置。一個是編譯程序並運行它。一個用於發送數據到串行端口(用於測試),另一個用於接收來自無線電模塊的響應。

這是一步一步如何解決問題。

  1. 冉程序。並收到預期的消息:

    HM-TRP模塊配置

    設置HM-TRP首次... 使用115kbps的 配置完成

  2. 切換到新窗口(我稱之爲#2)並執行「stty -aF/dev/ttyS0」以查看已設置的設置。結果(如圖所示)暗示我,我的C程序確定運作:

    speed 115200 baud; rows 0; columns 0; line = 0; 
    intr = ^C; quit = ^; erase = ^?; kill = ^H; eof = ^D; eol = <undef>; eol2 = <undef>; 
    swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; 
    flush = ^O; min = 1; time = 0; 
    parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts 
    ignbrk -brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff -iuclc -ixany 
    -imaxbel -iutf8 
    -opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0 
    -isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase 
    -tostop -echoprt -echoctl 
    -echoke 
    
  3. 開始 「屏幕」 的程序與參數 「的/ dev/ttyS0來115200」 爲115K的速度。

  4. 打開一個新的窗口(我稱之爲#3),並執行一個有效的命令到模塊如下:

    echo -en "xAAxFAx96x07" > /dev/ttyS0 
    

這裏的問題是,「畫面」的報告什麼時候它應該打印「確定」。於是我繼續...

  • 我重溫窗口#2終止屏幕程序,然後我「的/ dev/ttyS0來9600」再次重新啓動屏幕爲9600波特的速度剛看看發生了什麼。我再次重複步驟4,這次出現「OK」。
  • 但奇怪的是,當我離開屏幕程序運行9600波特,我執行我的C程序時,屏幕報告「OK」和(正如我期待的)一行垃圾向我暗示:最後的命令序列到收音機模塊:

    xAAxFAx1Ex00x01xC2x00 
    

    實際上確實顯示波特率的變化,只是從看垃圾的結果。

    所以接下來的問題是,爲什麼速率會重置爲9600bps?即使我在新窗口中驗證了正確的速率,波特率值是虛擬化還是應用程序之間的隔離?或者有什麼我失蹤?

    我的意思是我沒有問題,建立模塊,如果我只是吐出每個長碼與UNIX命令行回聲聲明,但我想在C.

    創建程序這是代碼,對於參數,我使用/dev/ttyS0 0,其中/ dev/ttyS0是我的串行端口(COM1)。

     #include <sys/stat.h> 
        #include <sys/types.h> 
        #include <sys/io.h> 
        #include <unistd.h> 
        #include <stdio.h> 
        #include <stdlib.h> 
        #include <string.h> 
        #include <termios.h> 
        #include <fcntl.h> 
    
        void outs(int fd, char* n,unsigned int sz){ 
        char *d=n; 
        unsigned int nwrt=0,x=0; 
        for (x=0;x<sz;x++){ //send byte one by one 
         while ((nwrt=write(fd,d,1))==0){ 
        usleep(10000); //waste CPU cycles passively until byte is sent 
         }; 
         d++; 
        } 
        } 
    
        int openser(speed_t speed,const char* dev){ 
        struct termios options; 
        //open serial port 
        int fd = open(dev, O_RDWR | O_NOCTTY | O_SYNC);if (fd < 0){printf("ERROR
    ");return -1;} 
        memset(&options,0,sizeof options); 
        tcflush(fd,TCIOFLUSH); 
        tcgetattr(fd,&options); 
        //set baud rate 
        cfsetispeed(&options, speed); 
        cfsetospeed(&options, speed); 
        options.c_iflag = IGNBRK | IGNPAR; //raw input 
        options.c_cflag |= (TOSTOP|NOFLSH|CLOCAL|CREAD|CS8);//ignore modem + parity: 8N1 + no rtscts 
        options.c_lflag=0; //raw input 
        options.c_oflag=0;options.c_cc[VMIN]=1;options.c_cc[VTIME]=0; //raw output 
        tcsetattr(fd, TCSANOW, &options); 
        return fd; 
        } 
    
        int main(int argc,char* argv[]){ 
        printf("HM-TRP module config
    
    "); 
        int rd=0; 
        setbuf(stdout,NULL); 
        if (argc < 2){printf("serial device + function required as argument.
    ");return -1;} 
        //open serial port for 115kbps baud 
        rd=openser(115200L,argv[1]);if (rd == 0){return -1;} 
        // get function 
        int funcn=strtol(argv[2],NULL,10); 
        switch (funcn){ 
        case 0: //function 0. 1st time setup. set things up at 9600 baud then switch to 115kbps 
        printf("Setting up HM-TRP for first time...
    "); 
        close(rd);rd=openser(9600L,argv[1]);if (rd == 0){return -1;} 
        case 1: 
        //set baud + wireless speed to 115kbps 
        printf("Using 115kbps
    "); 
        outs(rd,"xAAxFAxC3x00x01xC2x00",7); 
        outs(rd,"xAAxFAx1Ex00x01xC2x00",7); 
        break; 
        default: 
        //reset option in case something went wrong 
        printf("Resetting HM-TRP to defaults - 9600bps
    "); 
        outs(rd,"xAAxFAxF0",3); 
        break; 
        } 
        close(rd); 
        printf("Config Done
    "); 
        return 0; 
        } 
    

    我在做什麼錯?

    沙发
    0
    0

    經過一番發現,事實證明我需要在發送命令後添加一個延遲,因爲無線電模塊只有半雙工,因此它實際上忽略了導致速度指令不被識別的一半命令。 A usleep(100000)在每個輸出函數調用之後爲我做了訣竅。

    0
    votes
    answers
    60 views
    +10

    如何查找不同羣組和用戶擁有的所有服務/應用程序

    0

    在Linux中,打印/列出不同組和用戶擁有的所有服務/應用程序的方式是什麼?應該使用哪個命令?如何查找不同羣組和用戶擁有的所有服務/應用程序

    提前欣賞您的幫助

    感謝 Umesh製作納拉亞南AV

    沙发
    0
    0

    他們應該在/etc/init.d

    上市交易或者這可能會幫助你的問題:

    systemctl -l --type service --all 
    

    ,如果他們不起作用,你可以看手冊頁的systemctl命令。

    0
    votes
    answers
    54 views
    +10

    「mkdir || echo && exit」即使mkdir成功退出

    0

    mkdir $ 2 ||回聲「我無法創建目錄$ 2」 & &出口8「mkdir || echo && exit」即使mkdir成功退出

    大家好,這是我在這裏的第一篇文章,所以要善良。

    我正在製作一個腳本,現在這條線困擾着我。

    只有在無法創建目錄$ 2時纔會出現8號出口。 運行腳本併成功創建該目錄後,它仍然在8上退出。

    我錯過了什麼嗎?我認爲只有在左側出現錯誤時,「||」後面的命令纔會發生。

    我是Linux界的新手,作爲一個具有中小C經驗的人,我很困惑,幫忙! (使用Ubuntu,慶典,順便說一句)

    +2

    我認爲這是因爲運營商的優先。你可以放圓括號。如果mkdir失敗,則執行echo並返回true,以便執行第三個命令。也許你可以使用括號 – fernand0

    +2

    他是來自Unix和Linux SE的答案:https://unix.stackexchange.com/questions/88850/precedence-of-the-shell-logical-operators –

    沙发
    0
    4

    正如@ fernand0建議,問題是||&&符的優先級。您希望它運行類似mkdir || (echo && exit)的東西 - 即,如果mkdir失敗,則運行echo && exit部件。但是它實際上做的是運行類似(mkdir || echo) && exit的東西 - 也就是說,如果mkdirecho命令成功,它將運行exit部件。 echo幾乎總會成功,所以它幾乎總是會退出。

    因此,您需要明確地對命令進行分組,以覆蓋此優先級。但不要使用(),因爲它在子shell中運行其內容,並且exit將僅僅退出子shell,而不是主腳本;您可以改爲使用{ },也可以使用明確的if塊。另外,您實際上不需要echo && exit,因爲只有在echo命令成功時才運行exitecho幾乎總是成功,但在罕見的情況下,它失敗了,我敢肯定你想腳本退出。

    當我需要做這樣的事情在腳本中,我通常使用這個成語:

    mkdir "$2" || { 
        echo "I can't create directory $2" >&2 
        exit 8 
    } 
    

    (注:如@CharlesDuffy建議,我加了周圍$2雙引號 - 雙引號變量如果它們包含任何空格,通配符等,引用幾乎總是一個好主意。我也送錯誤消息到標準錯誤(>&2),而不是標準輸出,這也是通常一個更好的方式來做事)

    如果你想成爲更簡潔,你可以把它全部在一行。

    mkdir "$2" || { echo "I can't create directory $2" >&2; exit 8; } 
    

    注意,最終;(或換行)的}之前需要,或shell認爲}只是一個參數exit。你也可以去其他的方式,並使用一個明確的if塊:

    if ! mkdir "$2"; then 
        echo "I can't create directory $2" >&2 
        exit 8 
    fi 
    

    這個選項是一樣聰明,簡潔的,但是這是一件好事 - 巧妙而簡潔的到底是什麼造成了首位這個問題;清晰明確的代碼更好。

    +0

    @CharlesDuffy完成! –

    +0

    你知道我有多愛你嗎?另外,你能幫我解決這個問題:> var = $(file -b $ 1 | grep「ISO」) 我在腳本中有這一行。如果文件失敗(例如:當沒有參數時),我收到一條關於它的用法的巨大錯誤消息。如何使用2>將該錯誤消息發送到/ dev/null?我嘗試了幾個選項,但都沒有工作。 – NuSuntStudent

    +0

    @NuSuntStudent你需要重定向打印錯誤命令的stderr,所以'var = $(file -b「$ 1」2>/dev/null | grep「ISO」)''。請注意,我還在'$ 1'周圍添加了雙引號,這會將錯誤消息更改爲關於未找到沒有名稱的文件。我建議在腳本的開頭添加腳本參數的健全性檢查(例如'if [-z「$ 1」];然後echo「Usage:...」>&2; exit 1; fi')。這允許您給出一個描述性錯誤,而不是用戶必須從腳本的哪些部分失敗中找出哪些問題。 –

    板凳
    0
    -1

    嘗試:

    mkdir $1 
    if [ $? -ne 0 ] ; then 
        echo "I can't create directory $1" 
        exit 8 
    fi 
    
    +1

    這裏的降價引擎不是Github-flavored - 三重引號不會創建塊。在選擇多行代碼區域時,使用編輯器中的「{}」按鈕創建的四格縮進。 –

    +1

    不必要地測試'$?'是不好的形式。更好地寫'如果! mkdir「$ 1」;那麼' - 這樣,額外的日誌記錄或其他代碼更改就無法將您想要測試的操作與檢查本身解耦。 –

    地板
    0
    1

    ||&&沒有你習慣於在其他語言的優先級。沒有語法化,它相當於(a || b) && c(嚴格爲從左到右),而不是a || (b && c)(其中&&||具有更高的優先級)。將命令與||&&混合在一起並不是一個好主意;而是使用if語句。

    if ! mkdir "$2"; then 
        echo "I can't create directory $2" >&2 
        exit 8 
    fi 
    

    如果你真的想用列表的運營商,使用{ ... }到組適當的命令。

    mkdir "$2" || { echo "I can't create directory $2" >&2; exit 8; } 
    
    +2

    'echo && exit'是不好的形式 - 如果'echo'失敗,我們真的想避免退出嗎?這應該是'mkdir「$ 2」|| {echo「...」>&2; 8號出口; }' –

    +0

    同意,雖然如果簡單的'echo'失敗了,你可能有更大的問題需要解決。 – chepner

    0
    votes
    answers
    52 views
    +10

    爲什麼我的WSO2 EC2 linux機箱空間不足

    0

    我在AWS Ec2實例中託管了WSO2 API Manager和WSO2 Idenity服務器。 現在它的內存不足了。 我已清除日誌並嘗試過;但它仍然缺乏空間。 我得到了如何增加大小的解決方案,但我想知道是否有什麼我失蹤。可能是有一些配置或臨時目錄,我應該清理?爲什麼我的WSO2 EC2 linux機箱空間不足

    我df命令顯示輸出以下和/ dev/xvda1完全由用戶

    $ df -h 
    Filesystem  Size Used Avail Use% Mounted on 
    devtmpfs   16G 56K 16G 1% /dev 
    tmpfs   16G  0 16G 0% /dev/shm 
    /dev/xvda1  9.8G 9.7G  0 100%/
    
    +1

    看看[這篇文章](https://unix.stackexchange.com/questions/37221/finding-files-that-use-the-most-disk-space),並找到最大的文件在哪裏。請記住,如果文件仍在使用,刪除文件可能不會將空間釋放回文件系統。 – stdunbar

    +1

    我假設您正面臨內存問題,請檢查 /bin/wso2server.sh中的JVM Xms和Xmx配置。接下來,這也可能是由於限制了linux用戶可以創建的線程數。檢查/etc/security/limits.conf(詳細信息請參閱https://unix.stackexchange.com/questions/127557/increasing-nproc-limit-for-a-non-root-user-only-effective-by-restart)。另外檢查/etc/security/limits.d/90-nproc.conf 在此文件中添加用戶非root用戶。詳細信息在這裏:https://access.redhat.com/solutions/406663 – Pravin

    沙发
    0
    0

    你運行內存或磁盤空間?

    你已經發布了磁盤大小,但是提到它會出現OOM。

    您提供給JVM的內存量是多少?另外,你是否調整了實例的ulimit?

    +0

    我怎樣才能找到它? – Jocket

    0
    votes
    answers
    50 views
    +10

    使用Conda開發添加源代碼模塊不解析conda包

    0

    我有一個要求,使用它的源目錄導入依賴項。 (名稱被混淆,因爲這是爲了工作)。使用Conda開發添加源代碼模塊不解析conda包

    所以我用conda develop這增加了在站點包

    [[email protected] folder]$ conda develop /path/to/source/ 
    added /path/to/source/ 
    completed operation for: /path/to/source/ 
    

    新的模塊解決,當我運行使用python.py的代碼conda.pth文件,但後來它不解決暢達本身的依賴。即:

    (dq) [[email protected]]$ python file.py 
    Traceback (most recent call last): 
        File "file.py", line 10, in <module> 
        import utils as utils 
    *... 
    Various stack trace with import getting resolved 
    ...* 
        import Pyro.errors 
    ImportError: No module named errors 
    

    所以火焰兵是安裝在DQ暢達環境中的包,但通過通過conda develop進口源代碼的某些原因,它無法找到導入。我不確定這是否是一個問題,但代碼開發人員也有巧妙的想法,即命名模塊Pyro.py,然後在模塊的頂部導入Pyro.errors。有沒有辦法讓conda導入優先於源代碼?或者首先解決?

    在此先感謝您的幫助!

    +0

    您是否在'dq'環境中安裝了源模塊?另外,什麼是'python.py'? 「conda本身的依賴」是什麼意思?如果您正在運行的文件名爲「Pyro.py」,那麼錯誤也可能是由於您提到的原因導致的。 – darthbith

    +0

    'python.py'是運行燒瓶應用程序的模塊。相信我,我很想改變那個愚蠢的模塊的名字,但我不能,它是共享驅動器上的另一個代碼庫。 –

    沙发
    0
    0

    也許你應該從Jupyter所示的康達頁的Python你一起工作的包更改爲另一個新還是舊,一個如本photo

    0
    votes
    answers
    31 views
    +10

    將crt上傳到運行Amazon Linux的ec2

    0

    我有一臺運行Amazon Linux的ec2。我有一個crt,需要將其上傳到/ etc/pki/tls/certs。將crt上傳到運行Amazon Linux的ec2

    SFTP說權限被拒絕,我無法更改權限。

    我有一個SSH連接,但我不知道如何通過終端上傳文件。

    我看着涉及SCP,並試圖建議...

    scp custom.crt [email protected]:/etc/pki/tls/certs 
    

    我......

    The authenticity of host 'ip-172-31-1-182 (172.31.1.182)' can't be established. 
    ECDSA key fingerprint is xxxxxxxxx 
    ECDSA key fingerprint is xxxxxxxxx 
    Are you sure you want to continue connecting (yes/no)? yes 
    Warning: Permanently added 'ip-172-31-1-182,172.31.1.182' (ECDSA) to the list of known hosts. 
    Permission denied (publickey). 
    lost connection 
    

    有什麼錯誤的,我scp命令?

    是否有替代方案?

    沙发
    0
    0

    默認情況下ec2-user無權在/etc/pki/tls/certs位置寫入任何文件。您可以簡單地將cert證書發送到ec2用戶的家中或/tmp目錄中。之後,SSH到服務器,並使用sudo複製/移動/etc/pki/tls/certs位置的文件。 以下命令相同:

    scp custom.crt [email protected]:/home/ec2-user 
    ssh [email protected] 
    sudo mv custom.crt /etc/pki/tls/certs 
    
    +0

    感謝您的回覆。當我輸入第一個命令,我得到......「ssh:無法解析主機名ip-172-31-1-182:節點名或服務名提供,或不知道 失去連接」我發出命令,當我' m在我的本地目錄中包含custom.crt。但我不在SSH會話中。那是對的嗎? – webguy

    +0

    我剛剛在SSH會話中嘗試了scp命令,並且獲得了「Permission denied(publickey).lost connection」 – webguy

    +0

    ** ip-172-31-1-182 **是私有IP(僅在網絡中可訪問)。使用公共IP連接或使用VPN連接 –

    0
    votes
    answers
    50 views
    +10

    在Ubuntu上安裝libtorrent的Python3綁定

    0

    我正在嘗試爲Python3安裝libtorrent。它是一個C++庫的包裝。但是,我似乎無法讓它工作。在Ubuntu上安裝libtorrent的Python3綁定

    我已經試過:

    $ sudo apt-get install python-libtorrent 
    
    $ sudo apt-get install python3-libtorrent 
    
    $ sudo apt-get install libtorrent-rasterbar-dev 
    
    $ sudo apt-get install libtorrent-rasterbar-dev 
    

    PyPi page沒有一個下載鏈接,並因此它似乎並沒有被通過PIP安裝。有趣的是,它似乎在Python2中工作,但不幸的是,該項目的其餘部分是在Python3中。

    沙发
    0
    0

    在非Windows系統:

    通過運行./configure --enable-python-binding產生的setup.py。

    選擇您要安裝的的

    要構建Python綁定做:

    運行:

    python setup.py build 
    

    以root身份運行:

    python setup.py install 
    

    有關詳細信息,請參閱:http://www.libtorrent.org/python_binding.html

    +0

    不幸的是,這並沒有爲我工作。我仍然得到'ModuleNotFoundError:在python3中沒有名爲'libtorrent'的模塊,現在我在python2中得到'ImportError:/usr/local/lib/python2.7/dist-packages/libtorrent.so:undefined symbol:_ZN10libtorrent20generate_fingerprintENSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEiiii'。我唯一能想到的是'setup.py'是用python2.7編寫的,所以我必須使用它而不是python3。也許這樣做意味着它試圖將它安裝到python2而不是3。 – Sam

    0
    votes
    answers
    1.2 K views
    +10

    在大會遞歸解決楊輝三角(NCK)

    0

    我目前堅持從組合問題得到了答案。我的basecase工作得很好。我認爲問題在於評估組合(n-1,k),然後評估組合(n-1,k-1)。在大會遞歸解決楊輝三角(NCK)

    這裏是我的代碼:n和k是從用戶輸入。

    sub esp, 2 
    push word[n] 
    push word[k] 
    call combi 
    pop word[ans] ;store yung combi value sa ans 
    
    ;convert to ascii string value 
    add word[ans], 30h 
    
    ;print answer 
    mov eax, 4 
    mov ebx, 1 
    mov ecx, ans 
    mov edx, 2 
    int 80h 
    
    jmp exit 
    
    
    combi: 
        mov ebp, esp 
    
        mov ax, word[ebp+4] ;ax = k 
        cmp [ebp+6], ax  ;if (n==k) 
        je basecase 
    
        cmp word[ebp+4],0 ;cmp k = 0 
        je basecase 
    
        ;combi(n-1,k) 
        mov ax, [ebp+6] ; ax = n 
        mov bx, [ebp+4] ; bx = k 
    
        dec ax ;n-1 
    
        ;execute again 
        sub esp, 2 
        push ax 
        push bx 
        call combi 
        pop cx  ;stores to cx popped value combi(n-1,k) 
        mov ebp, esp ;update pointers 
    
        ;combi(n-1,k-1) 
        push ax 
        dec bx 
        push bx 
        call combi 
        pop dx  ;stores to dx popped value combi(n-1,k-1) 
        mov ebp, esp ;update pointers 
    
        add cx, dx ;combi(n-1,k) + combi(n-1,k-1) 
    
        mov word[ebp+8], cx 
        jmp combi_exit 
    
    
    basecase: 
        mov word[ebp+8], 1 
    
    combi_exit: 
        ret 4 
    

    希望您的迴應和出色的想法!謝謝!

    +1

    [編輯],添加上它是錯的情況下,更多的細節,使這個[MCVE。使用調試器單步執行代碼並查看寄存器,以便您可以按照預期方式查看停止工作的位置。 –

    +0

    雖然這個'add word [ans],30h'顯然是錯誤的。它只適用於一位數字。 (請參閱[x86標記wiki](https://stackoverflow.com/tags/x86/info)中的多位數字FAQ條目。)爲什麼在32位Linux進程中的任何地方都使用16位操作?使用32位操作會更有效率。 –

    +0

    不能編譯,缺少一些部分(如數據定義)。 – Ped7g

    沙发
    0
    0

    要解決你的遞歸的combi:的中間部分有一個問題:

    ... 
        call combi 
        pop cx  ;stores to cx popped value combi(n-1,k) 
    ;*^this freed the allocated space for result 
        mov ebp, esp ;update pointers 
    ;* not needed, as you will not use EBP right now, and next call destroys it 
    
        ;combi(n-1,k-1) 
        push ax 
    ;*^pushing first argument, but no stack space reserved for result 
        dec bx 
        push bx 
        call combi 
        ... 
    

    修復 你可以調整部分:

    編輯:這不會爲2+正常工作深遞歸,因爲你需要不保留寄存器,整個遞歸結構需要更多的關心,我會簡單地選擇在第一位置更簡單的設計,重寫一遍,不是解決這些小問題。這個「修復」至少可以阻止部分違約行爲。

    ... 
        call combi 
        mov cx,[esp]  ;stores to cx value combi(n-1,k) 
    ;*^keeps the stack space reserved (not popping) 
        ;combi(n-1,k-1) 
        push ax 
        ... 
    

    當然還有其他問題,您的輸出是隻爲單個數字是正確的,但只是搜索堆棧溢出,tag [x86] info對於那些不打算在這裏重複。

    順便說一句,這IMO從不幸的過於複雜的使用堆棧莖,你有你爲什麼遵循這樣複雜的調用約定一些特別的原因嗎?如何在自定義快速調用類似的參數和結果寄存器?它的性能也更高,但對我個人而言,跟蹤事情並正確處理堆棧也更容易。如果我會嘗試......我可以在以後的版本中添加我自己的變體。


    編輯:

    文件:用寄存器調用約定全面工作示例so_32b_pascal_triangle.asm

    section .text 
    
    global _start 
    _start: 
        mov  ecx,5  ; n 
        mov  edx,2  ; k 
        call combi 
        ; return to linux with sys_exit(result) 
        mov  ebx,eax 
        mov  eax,1 
        int  80h 
    
    ; ECX = n, EDX = k, returns result in EAX, no other register modified 
    ; (_msfastcall-like convention, but extended to preserve ECX+EDX) 
    combi: ; c(n, k) = c(n-1, k-1) + c(n-1, k), c(i, 0) = c(i, i) = 1 
        test edx,edx  ; k == 0 
        je  .basecases ; c(i, 0) = 1 
        cmp  edx,ecx  ; k == n 
        je  .basecases ; c(i, i) = 1 
        ; 0 < k < n case: 
        dec  ecx   ; n-1 
        call combi  ; EAX = c(n-1, k) 
        push esi 
        mov  esi,eax  ; keep c(n-1, k) in ESI 
        dec  edx   ; k-1 
        call combi  ; EAX = c(n-1, k-1) 
        add  eax,esi  ; EAX = c(n-1, k-1) + c(n-1, k) 
        ; restore all modified registers 
        pop  esi 
        inc  ecx 
        inc  edx 
        ret     ; return result in EAX 
    .basecases: 
        mov  eax,1 
        ret 
    

    編譯+運行+顯示結果:

    ...$ nasm -f elf32 -F dwarf -g so_32b_pascal_triangle.asm -l so_32b_pascal_triangle.lst -w+all 
    ...$ ld -m elf_i386 -o so_32b_pascal_triangle so_32b_pascal_triangle.o 
    ...$ ./so_32b_pascal_triangle ; echo $? 
    10 
    ...$ 
    

    編輯:

    而對於我自己的好奇心,試圖把它從C-ISH C++代碼(驗證fastcall約定按預期工作需要與C/C++的互操作性,即使):

    so_32b_pascal_triangle.asm文件具有相同combi:代碼,但開始時修改(添加全球,除去_start):

    section .text 
    
    global combi 
    ; ECX = n, EDX = k, returns result in EAX, no other register modified 
    ; (fastcall-like convention, but extended to preserve ECX+EDX) 
    combi: ; c(n, k) = c(n-1, k-1) + c(n-1, k), c(i, 0) = c(i, i) = 1 
        ... 
    

    文件so_32b_pascal_triangle_Cpp.cpp

    #include <cstdio> 
    #include <cstdint> 
    
    extern "C" __attribute__ ((fastcall)) uint32_t combi(uint32_t n, uint32_t k); 
    
    int main() 
    { 
        for (uint32_t n = 0; n < 10; ++n) { 
         printf("%*c", 1+2*(10-n), ' '); 
         for (uint32_t k = 0; k <= n; ++k) { 
          printf("%4d", combi(n, k)); 
          // 4-char width formatting - works for 3 digit results max. 
         } 
         printf("
    "); 
        } 
    } 
    

    生成+測試:

    $ nasm -f elf32 -F dwarf -g so_32b_pascal_triangle.asm -l so_32b_pascal_triangle.lst -w+all 
    $ g++ -std=c++17 -c -m32 -O3 -Wall -Wpedantic -Wextra so_32b_pascal_triangle_Cpp.cpp 
    $ g++ -m32 so_32b_pascal_triangle*.o -o so_32b_pascal_triangle 
    $ ./so_32b_pascal_triangle 
             1 
             1 1 
            1 2 1 
            1 3 3 1 
           1 4 6 4 1 
           1 5 10 10 5 1 
          1 6 15 20 15 6 1 
          1 7 21 35 35 21 7 1 
         1 8 28 56 70 56 28 8 1 
         1 9 36 84 126 126 84 36 9 1